aboutsummaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2013-04-25 20:03:56 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2013-04-25 20:03:56 +0000
commit70c842246a7ffdd808630db4af137711eaa33346 (patch)
treefaaadf11511ea057e94e662bbf56a70751cbbbec /java
parentfd942d6cf3f86202ae6b8eafb6c7d5816c5831b3 (diff)
downloadports-70c842246a7ffdd808630db4af137711eaa33346.tar.gz
ports-70c842246a7ffdd808630db4af137711eaa33346.zip
Notes
Diffstat (limited to 'java')
-rw-r--r--java/openjdk6/Makefile55
-rw-r--r--java/openjdk6/distinfo4
-rw-r--r--java/openjdk6/files/icedtea/jaxp.patch15
-rw-r--r--java/openjdk6/files/icedtea/jaxws.patch13
-rw-r--r--java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch429
-rw-r--r--java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch8066
-rw-r--r--java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch355
-rw-r--r--java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch13847
-rw-r--r--java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch42
-rw-r--r--java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch101
-rw-r--r--java/openjdk6/files/icedtea/openjdk/7032388-work_without_cmov_instruction.patch (renamed from java/openjdk6/files/icedtea/7032388-work_without_cmov_instruction.patch)0
-rw-r--r--java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch1436
-rw-r--r--java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch71
-rw-r--r--java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch436
-rw-r--r--java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch299
-rw-r--r--java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch75
-rw-r--r--java/openjdk6/files/icedtea/security/20130201/8001235.patch37
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch54
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch228
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/6657673.patch9381
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/7200507.patch230
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8000724.patch1368
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8001031.patch5457
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8001040.patch113
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8001322.patch61
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8001329.patch32
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8003335.patch63
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8003445.patch77
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8003543.patch227
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8004261.patch142
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8004336.patch29
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8004986.patch374
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8005432.patch511
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8005943.patch202
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8006309.patch22
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8006435.patch76
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8006790.patch166
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8006795.patch35
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8007406.patch31
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8007617.patch376
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8007667.patch579
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8007918.patch357
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8009063.patch67
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8009305.patch68
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8009699.patch25
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8009814.patch27
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8009857.patch66
-rw-r--r--java/openjdk6/files/patch-set13
48 files changed, 45693 insertions, 45 deletions
diff --git a/java/openjdk6/Makefile b/java/openjdk6/Makefile
index 038475b2ee7b..a6f3e490bc36 100644
--- a/java/openjdk6/Makefile
+++ b/java/openjdk6/Makefile
@@ -3,7 +3,7 @@
PORTNAME= openjdk6
PORTVERSION= b27
-PORTREVISION?= 2
+PORTREVISION?= 3
CATEGORIES= java devel
MASTER_SITES= http://download.java.net/openjdk/jdk6/promoted/${PORTVERSION}/ \
http://download.java.net/jaxp/openjdk/jdk6/:jaxp \
@@ -39,7 +39,9 @@ RUN_DEPENDS= javavm:${PORTSDIR}/java/javavmwrapper \
OPENJDK_BUILDDATE= 26_oct_2012
-EXTRA_PATCHES= ${FILESDIR}/icedtea/security/20120830/7182135-impossible_to_use_some_editors_directly.patch \
+EXTRA_PATCHES= ${FILESDIR}/icedtea/jaxp.patch \
+ ${FILESDIR}/icedtea/jaxws.patch \
+ ${FILESDIR}/icedtea/security/20120830/7182135-impossible_to_use_some_editors_directly.patch \
${FILESDIR}/icedtea/security/20130201/7201068.patch \
${FILESDIR}/icedtea/security/20130201/6563318.patch \
${FILESDIR}/icedtea/security/20130201/6664509.patch \
@@ -68,12 +70,52 @@ EXTRA_PATCHES= ${FILESDIR}/icedtea/security/20120830/7182135-impossible_to_use_s
${FILESDIR}/icedtea/security/20130201/8001307.patch \
${FILESDIR}/icedtea/security/20130201/8001972.patch \
${FILESDIR}/icedtea/security/20130201/8002325.patch \
- ${FILESDIR}/icedtea/security/20130201/8001235.patch \
${FILESDIR}/icedtea/security/20130219/8006446.patch \
${FILESDIR}/icedtea/security/20130219/8006777.patch \
${FILESDIR}/icedtea/security/20130219/8007688.patch \
${FILESDIR}/icedtea/security/20130304/8007014.patch \
- ${FILESDIR}/icedtea/security/20130304/8007675.patch
+ ${FILESDIR}/icedtea/security/20130304/8007675.patch \
+ ${FILESDIR}/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch \
+ ${FILESDIR}/icedtea/security/20130416/8009063.patch \
+ ${FILESDIR}/icedtea/openjdk/8004302-soap_test_failure.patch \
+ ${FILESDIR}/icedtea/security/20130416/6657673.patch \
+ ${FILESDIR}/icedtea/security/20130416/6657673-fixup.patch \
+ ${FILESDIR}/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch \
+ ${FILESDIR}/icedtea/security/20130416/6657673-factory_finder.patch \
+ ${FILESDIR}/icedtea/openjdk/6669869-queries_per_appcontext.patch \
+ ${FILESDIR}/icedtea/openjdk/5102804-memory_leak.patch \
+ ${FILESDIR}/icedtea/openjdk/6963811-deadlock_fix.patch \
+ ${FILESDIR}/icedtea/openjdk/7064279-resource_release.patch \
+ ${FILESDIR}/icedtea/openjdk/7064279-fixup.patch \
+ ${FILESDIR}/icedtea/security/20130416/7200507.patch \
+ ${FILESDIR}/icedtea/security/20130416/8000724.patch \
+ ${FILESDIR}/icedtea/security/20130416/8004986.patch \
+ ${FILESDIR}/icedtea/openjdk/6501644-icu_sync.patch \
+ ${FILESDIR}/icedtea/openjdk/6886358-layout_update.patch \
+ ${FILESDIR}/icedtea/security/20130416/8001031.patch \
+ ${FILESDIR}/icedtea/openjdk/7017324-kerning_crash.patch \
+ ${FILESDIR}/icedtea/security/20130416/8001040.patch \
+ ${FILESDIR}/icedtea/security/20130416/8001322.patch \
+ ${FILESDIR}/icedtea/security/20130416/8001329.patch \
+ ${FILESDIR}/icedtea/security/20130416/8003335.patch \
+ ${FILESDIR}/icedtea/security/20130416/8003445.patch \
+ ${FILESDIR}/icedtea/security/20130416/8003543.patch \
+ ${FILESDIR}/icedtea/security/20130416/8004261.patch \
+ ${FILESDIR}/icedtea/security/20130416/8004336.patch \
+ ${FILESDIR}/icedtea/security/20130416/8005432.patch \
+ ${FILESDIR}/icedtea/security/20130416/8005943.patch \
+ ${FILESDIR}/icedtea/security/20130416/8006309.patch \
+ ${FILESDIR}/icedtea/security/20130416/8006435.patch \
+ ${FILESDIR}/icedtea/security/20130416/8006790.patch \
+ ${FILESDIR}/icedtea/security/20130416/8006795.patch \
+ ${FILESDIR}/icedtea/security/20130416/8007406.patch \
+ ${FILESDIR}/icedtea/security/20130416/8007617.patch \
+ ${FILESDIR}/icedtea/security/20130416/8007667.patch \
+ ${FILESDIR}/icedtea/security/20130416/8007918.patch \
+ ${FILESDIR}/icedtea/security/20130416/8009305.patch \
+ ${FILESDIR}/icedtea/security/20130416/8009699.patch \
+ ${FILESDIR}/icedtea/security/20130416/8009814.patch \
+ ${FILESDIR}/icedtea/security/20130416/8009857.patch
OPTIONS_DEFINE= ICEDTEA IPV6 POLICY SOUND TZUPDATE
OPTIONS_DEFAULT=ICEDTEA IPV6 TZUPDATE
@@ -98,7 +140,7 @@ USE_GMAKE= yes
USE_MOTIF= yes
USE_XORG= x11 xext xi xt xtst
-JAXP_BUILD= 144_04
+JAXP_BUILD= 144_05
JAXPFILE= jaxp${JAXP_BUILD}.zip
JAXWS_BUILD= 2_1_6-2011_06_13
JAXWSFILE= jdk6-jaxws${JAXWS_BUILD}.zip
@@ -148,6 +190,7 @@ BOOTSTRAPJDKDIR?= ${LOCALBASE}/bootstrap-openjdk
BUILD_DEPENDS+= ${BOOTSTRAPJDKDIR}/bin/javac:${PORTSDIR}/java/bootstrap-openjdk
.endif
+FETCH_ARGS= -Fpr
MAKE_ENV= LANG=C LC_ALL=C OS= \
ALT_JDK_IMPORT_PATH=${BOOTSTRAPJDKDIR} \
ALT_BOOTDIR=${BOOTSTRAPJDKDIR} \
@@ -198,7 +241,7 @@ MAKE_ENV+= SKIP_FASTDEBUG_BUILD=true
.endif
.if ${PORT_OPTIONS:MICEDTEA}
-EXTRA_PATCHES+= ${FILESDIR}/icedtea/7032388-work_without_cmov_instruction.patch \
+EXTRA_PATCHES+= ${FILESDIR}/icedtea/openjdk/7032388-work_without_cmov_instruction.patch \
${FILESDIR}/icedtea/applet_hole.patch \
${FILESDIR}/icedtea/jpegclasses.patch
.endif
diff --git a/java/openjdk6/distinfo b/java/openjdk6/distinfo
index 3a73aea412b0..76dc245659ba 100644
--- a/java/openjdk6/distinfo
+++ b/java/openjdk6/distinfo
@@ -1,7 +1,7 @@
SHA256 (openjdk-6-src-b27-26_oct_2012.tar.gz) = 044c3877b15940ff04f8aa817337f2878a00cc89674854557f1a02f15b1802a0
SIZE (openjdk-6-src-b27-26_oct_2012.tar.gz) = 45789350
-SHA256 (jaxp144_04.zip) = 490f696218c1fed9cb180680af883fe309b414fec232e9cec19645e12ad0b43c
-SIZE (jaxp144_04.zip) = 5976385
+SHA256 (jaxp144_05.zip) = c1a8a5a219fa55ecbf2ad43b66514335a3e96ccad40bd2ec9165a821343b2bff
+SIZE (jaxp144_05.zip) = 5976387
SHA256 (jdk6-jaxws2_1_6-2011_06_13.zip) = 229040544e791f44906e8e7b6f6faf503c730a5d854275135f3925490d5c3be3
SIZE (jdk6-jaxws2_1_6-2011_06_13.zip) = 5512710
SHA256 (jdk6-jaf-b20.zip) = 78c7b5c9d6271e88ee46abadd018a61f1e9645f8936cc8df1617e5f4f5074012
diff --git a/java/openjdk6/files/icedtea/jaxp.patch b/java/openjdk6/files/icedtea/jaxp.patch
new file mode 100644
index 000000000000..b5d9048a1508
--- /dev/null
+++ b/java/openjdk6/files/icedtea/jaxp.patch
@@ -0,0 +1,15 @@
+--- jaxp/build.properties.orig 2012-10-26 14:23:11.000000000 -0400
++++ jaxp/build.properties 2013-04-25 14:25:15.000000000 -0400
+@@ -77,6 +77,12 @@
+ # Where patches to drop bundle sources live
+ patches.dir=patches
+
++# Patches to apply
++jaxp_src.patch.list=6657673.patch \
++ 6657673-fixup.patch \
++ 7133220-factory_finder_parser_transform_useBSClassLoader.patch \
++ 6657673-factory_finder.patch
++
+ # Sanity information
+ sanity.info= Sanity Settings:${line.separator}\
+ ant.home=${ant.home}${line.separator}\
diff --git a/java/openjdk6/files/icedtea/jaxws.patch b/java/openjdk6/files/icedtea/jaxws.patch
new file mode 100644
index 000000000000..b93ba153a0c1
--- /dev/null
+++ b/java/openjdk6/files/icedtea/jaxws.patch
@@ -0,0 +1,13 @@
+--- jaxws/build.properties.orig 2012-10-26 14:23:24.000000000 -0400
++++ jaxws/build.properties 2013-04-25 15:06:29.000000000 -0400
+@@ -77,6 +77,10 @@
+ # Where patches to drop bundle sources live
+ patches.dir=patches
+
++# Patches to apply
++jaxws_src.patch.list=8003543.patch \
++ 8005432.patch
++
+ # Sanity information
+ sanity.info= Sanity Settings:${line.separator}\
+ ant.home=${ant.home}${line.separator}\
diff --git a/java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch b/java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch
new file mode 100644
index 000000000000..01dd35c1bee2
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch
@@ -0,0 +1,429 @@
+# HG changeset patch
+# User andrew
+# Date 1365704033 -3600
+# Node ID 06255d9f82761abc74c30f31fda00968ffef4bc3
+# Parent a939f541de9af5ccb78225c27cd46cd7dc6bcf87
+5102804: Memory leak in Introspector.getBeanInfo(Class) for custom BeanInfo: Class param (includes WeakCache from 6397609)
+Reviewed-by: peterz
+
+diff --git a/src/share/classes/com/sun/beans/WeakCache.java b/src/share/classes/com/sun/beans/WeakCache.java
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/classes/com/sun/beans/WeakCache.java
+@@ -0,0 +1,91 @@
++/*
++ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Sun designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Sun in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ */
++package com.sun.beans;
++
++import java.lang.ref.Reference;
++import java.lang.ref.WeakReference;
++
++import java.util.Map;
++import java.util.WeakHashMap;
++
++/**
++ * A hashtable-based cache with weak keys and weak values.
++ * An entry in the map will be automatically removed
++ * when its key is no longer in the ordinary use.
++ * A value will be automatically removed as well
++ * when it is no longer in the ordinary use.
++ *
++ * @since 1.7
++ *
++ * @author Sergey A. Malenkov
++ */
++public final class WeakCache<K, V> {
++ private final Map<K, Reference<V>> map = new WeakHashMap<K, Reference<V>>();
++
++ /**
++ * Returns a value to which the specified {@code key} is mapped,
++ * or {@code null} if this map contains no mapping for the {@code key}.
++ *
++ * @param key the key whose associated value is returned
++ * @return a value to which the specified {@code key} is mapped
++ */
++ public V get(K key) {
++ Reference<V> reference = this.map.get(key);
++ if (reference == null) {
++ return null;
++ }
++ V value = reference.get();
++ if (value == null) {
++ this.map.remove(key);
++ }
++ return value;
++ }
++
++ /**
++ * Associates the specified {@code value} with the specified {@code key}.
++ * Removes the mapping for the specified {@code key} from this cache
++ * if it is present and the specified {@code value} is {@code null}.
++ * If the cache previously contained a mapping for the {@code key},
++ * the old value is replaced by the specified {@code value}.
++ *
++ * @param key the key with which the specified value is associated
++ * @param value the value to be associated with the specified key
++ */
++ public void put(K key, V value) {
++ if (value != null) {
++ this.map.put(key, new WeakReference<V>(value));
++ }
++ else {
++ this.map.remove(key);
++ }
++ }
++
++ /**
++ * Removes all of the mappings from this cache.
++ */
++ public void clear() {
++ this.map.clear();
++ }
++}
+diff --git a/src/share/classes/java/beans/Introspector.java b/src/share/classes/java/beans/Introspector.java
+--- jdk/src/share/classes/java/beans/Introspector.java
++++ jdk/src/share/classes/java/beans/Introspector.java
+@@ -25,25 +25,18 @@
+
+ package java.beans;
+
++import com.sun.beans.WeakCache;
+ import com.sun.beans.finder.ClassFinder;
+
+-import java.lang.ref.Reference;
+-import java.lang.ref.SoftReference;
+-
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Modifier;
+
+-import java.security.AccessController;
+-import java.security.PrivilegedAction;
+-
+-import java.util.Collections;
+ import java.util.Map;
+ import java.util.ArrayList;
+ import java.util.HashMap;
+ import java.util.Iterator;
+ import java.util.EventListener;
+ import java.util.List;
+-import java.util.WeakHashMap;
+ import java.util.TreeMap;
+ import sun.awt.AppContext;
+ import sun.reflect.misc.ReflectUtil;
+@@ -110,8 +103,8 @@
+ public final static int IGNORE_ALL_BEANINFO = 3;
+
+ // Static Caches to speed up introspection.
+- private static Map declaredMethodCache =
+- Collections.synchronizedMap(new WeakHashMap());
++ private static WeakCache<Class<?>, Method[]> declaredMethodCache =
++ new WeakCache<Class<?>, Method[]>();
+
+ private static final Object BEANINFO_CACHE = new Object();
+
+@@ -177,20 +170,21 @@
+ if (!ReflectUtil.isPackageAccessible(beanClass)) {
+ return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
+ }
+- Map<Class<?>, BeanInfo> map;
+ synchronized (BEANINFO_CACHE) {
+- map = (Map<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
+- if (map == null) {
+- map = Collections.synchronizedMap(new WeakHashMap<Class<?>, BeanInfo>());
+- AppContext.getAppContext().put(BEANINFO_CACHE, map);
++ WeakCache<Class<?>, BeanInfo> beanInfoCache =
++ (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
++
++ if (beanInfoCache == null) {
++ beanInfoCache = new WeakCache<Class<?>, BeanInfo>();
++ AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache);
+ }
++ BeanInfo beanInfo = beanInfoCache.get(beanClass);
++ if (beanInfo == null) {
++ beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
++ beanInfoCache.put(beanClass, beanInfo);
++ }
++ return beanInfo;
+ }
+- BeanInfo bi = map.get(beanClass);
+- if (bi == null) {
+- bi = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
+- map.put(beanClass, bi);
+- }
+- return bi;
+ }
+
+ /**
+@@ -337,11 +331,13 @@
+ */
+
+ public static void flushCaches() {
+- Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE);
+- if (map != null) {
+- map.clear();
++ synchronized (BEANINFO_CACHE) {
++ WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE);
++ if (beanInfoCache != null) {
++ beanInfoCache.clear();
++ }
++ declaredMethodCache.clear();
+ }
+- declaredMethodCache.clear();
+ }
+
+ /**
+@@ -363,11 +359,13 @@
+ if (clz == null) {
+ throw new NullPointerException();
+ }
+- Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE);
+- if (map != null) {
+- map.remove(clz);
++ synchronized (BEANINFO_CACHE) {
++ WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE);
++ if (beanInfoCache != null) {
++ beanInfoCache.put(clz, null);
++ }
++ declaredMethodCache.put(clz, null);
+ }
+- declaredMethodCache.remove(clz);
+ }
+
+ //======================================================================
+@@ -1306,41 +1304,26 @@
+ /*
+ * Internal method to return *public* methods within a class.
+ */
+- private static synchronized Method[] getPublicDeclaredMethods(Class clz) {
++ private static Method[] getPublicDeclaredMethods(Class clz) {
+ // Looking up Class.getDeclaredMethods is relatively expensive,
+ // so we cache the results.
+- Method[] result = null;
+ if (!ReflectUtil.isPackageAccessible(clz)) {
+ return new Method[0];
+ }
+- final Class fclz = clz;
+- Reference ref = (Reference)declaredMethodCache.get(fclz);
+- if (ref != null) {
+- result = (Method[])ref.get();
+- if (result != null) {
+- return result;
++ synchronized (BEANINFO_CACHE) {
++ Method[] result = declaredMethodCache.get(clz);
++ if (result == null) {
++ result = clz.getMethods();
++ for (int i = 0; i < result.length; i++) {
++ Method method = result[i];
++ if (!method.getDeclaringClass().equals(clz)) {
++ result[i] = null;
++ }
++ }
++ declaredMethodCache.put(clz, result);
+ }
++ return result;
+ }
+-
+- // We have to raise privilege for getDeclaredMethods
+- result = (Method[]) AccessController.doPrivileged(new PrivilegedAction() {
+- public Object run() {
+- return fclz.getDeclaredMethods();
+- }
+- });
+-
+-
+- // Null out any non-public methods.
+- for (int i = 0; i < result.length; i++) {
+- Method method = result[i];
+- int mods = method.getModifiers();
+- if (!Modifier.isPublic(mods)) {
+- result[i] = null;
+- }
+- }
+- // Add it to the cache.
+- declaredMethodCache.put(fclz, new SoftReference(result));
+- return result;
+ }
+
+ //======================================================================
+diff --git a/test/java/beans/Introspector/Test5102804.java b/test/java/beans/Introspector/Test5102804.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/beans/Introspector/Test5102804.java
+@@ -0,0 +1,155 @@
++/*
++ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ */
++
++/*
++ * @test
++ * @bug 5102804
++ * @summary Tests memory leak
++ * @author Sergey Malenkov
++ */
++
++import java.beans.BeanInfo;
++import java.beans.IntrospectionException;
++import java.beans.Introspector;
++import java.beans.PropertyDescriptor;
++import java.beans.SimpleBeanInfo;
++import java.lang.ref.Reference;
++import java.lang.ref.WeakReference;
++import java.net.URL;
++import java.net.URLClassLoader;
++
++public class Test5102804 {
++ private static final String BEAN_NAME = "Test5102804$Example";
++ private static final String BEAN_INFO_NAME = BEAN_NAME + "BeanInfo";
++
++ public static void main(String[] args) {
++ if (!isCollectible(getReference()))
++ throw new Error("Reference is not collected");
++ }
++
++ private static Reference getReference() {
++ try {
++ ClassLoader loader = new Loader();
++ Class type = Class.forName(BEAN_NAME, true, loader);
++ if (!type.getClassLoader().equals(loader)) {
++ throw new Error("Wrong class loader");
++ }
++ BeanInfo info = Introspector.getBeanInfo(type);
++ if (0 != info.getDefaultPropertyIndex()) {
++ throw new Error("Wrong bean info found");
++ }
++ return new WeakReference<Class>(type);
++ }
++ catch (IntrospectionException exception) {
++ throw new Error("Introspection Error", exception);
++ }
++ catch (ClassNotFoundException exception) {
++ throw new Error("Class Not Found", exception);
++ }
++ }
++
++ private static boolean isCollectible(Reference reference) {
++ int[] array = new int[10];
++ while (true) {
++ try {
++ array = new int[array.length + array.length / 3];
++ }
++ catch (OutOfMemoryError error) {
++ return null == reference.get();
++ }
++ }
++ }
++
++ /**
++ * Custom class loader to load the Example class by itself.
++ * Could also load it from a different code source, but this is easier to set up.
++ */
++ private static final class Loader extends URLClassLoader {
++ Loader() {
++ super(new URL[] {
++ Test5102804.class.getProtectionDomain().getCodeSource().getLocation()
++ });
++ }
++
++ @Override
++ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
++ Class c = findLoadedClass(name);
++ if (c == null) {
++ if (BEAN_NAME.equals(name) || BEAN_INFO_NAME.equals(name)) {
++ c = findClass(name);
++ }
++ else try {
++ c = getParent().loadClass(name);
++ }
++ catch (ClassNotFoundException exception) {
++ c = findClass(name);
++ }
++ }
++ if (resolve) {
++ resolveClass(c);
++ }
++ return c;
++ }
++ }
++
++ /**
++ * A simple bean to load from the Loader class, not main class loader.
++ */
++ public static final class Example {
++ private int value;
++
++ public int getValue() {
++ return value;
++ }
++
++ public void setValue(int value) {
++ this.value = value;
++ }
++ }
++
++ /**
++ * The BeanInfo for the Example class.
++ * It is also loaded from the Loader class.
++ */
++ public static final class ExampleBeanInfo extends SimpleBeanInfo {
++ @Override
++ public int getDefaultPropertyIndex() {
++ return 0;
++ }
++
++ @Override
++ public PropertyDescriptor[] getPropertyDescriptors() {
++ try {
++ return new PropertyDescriptor[] {
++ new PropertyDescriptor("value", Class.forName(BEAN_NAME))
++ };
++ }
++ catch (ClassNotFoundException exception) {
++ return null;
++ }
++ catch (IntrospectionException exception) {
++ return null;
++ }
++ }
++ }
++}
diff --git a/java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch b/java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch
new file mode 100644
index 000000000000..299a59691ef8
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch
@@ -0,0 +1,8066 @@
+# HG changeset patch
+# User andrew
+# Date 1365739093 -3600
+# Node ID e8ed86062291305172267be90dcec2acef7c15a8
+# Parent c7ddbf756d7f35d6e782eb91b86ce2938de44fb8
+6501644: sync LayoutEngine *code* structure to match ICU
+Reviewed-by: prr
+
+diff --git a/make/sun/font/Makefile b/make/sun/font/Makefile
+--- jdk/make/sun/font/Makefile
++++ jdk/make/sun/font/Makefile
+@@ -209,3 +209,7 @@
+ -I$(PLATFORM_SRC)/native/sun/java2d/d3d
+ endif
+
++# Make the Layout Engine build standalone
++CPPFLAGS += -DLE_STANDALONE
++
++
+diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp b/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp
+@@ -37,6 +37,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 AlternateSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
+ {
+ // NOTE: For now, we'll just pick the first alternative...
+@@ -64,3 +66,5 @@
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.h b/src/share/native/sun/font/layout/AlternateSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h
+@@ -32,12 +32,19 @@
+ #ifndef __ALTERNATESUBSTITUTIONSUBTABLES_H
+ #define __ALTERNATESUBSTITUTIONSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct AlternateSetTable
+ {
+ le_uint16 glyphCount;
+@@ -52,4 +59,5 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/AnchorTables.cpp b/src/share/native/sun/font/layout/AnchorTables.cpp
+--- jdk/src/share/native/sun/font/layout/AnchorTables.cpp
++++ jdk/src/share/native/sun/font/layout/AnchorTables.cpp
+@@ -35,6 +35,8 @@
+ #include "AnchorTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ void AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance,
+ LEPoint &anchor) const
+ {
+@@ -124,3 +126,6 @@
+
+ fontInstance->pixelsToUnits(pixels, anchor);
+ }
++
++U_NAMESPACE_END
++
+diff --git a/src/share/native/sun/font/layout/AnchorTables.h b/src/share/native/sun/font/layout/AnchorTables.h
+--- jdk/src/share/native/sun/font/layout/AnchorTables.h
++++ jdk/src/share/native/sun/font/layout/AnchorTables.h
+@@ -32,10 +32,17 @@
+ #ifndef __ANCHORTABLES_H
+ #define __ANCHORTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct AnchorTable
+ {
+ le_uint16 anchorFormat;
+@@ -66,5 +73,7 @@
+ void getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const;
+ };
+
++U_NAMESPACE_END
++#endif
+
+-#endif
++
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+@@ -49,23 +49,25 @@
+ #include "ArabicShaping.h"
+ #include "CanonShaping.h"
+
++U_NAMESPACE_BEGIN
++
+ le_bool CharSubstitutionFilter::accept(LEGlyphID glyph) const
+ {
+ return fFontInstance->canDisplay((LEUnicode) glyph);
+ }
+
+-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(
+- const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine)
++
++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
+ {
+ fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+ }
+
+-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(
+- const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
+ {
+ fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount);
+@@ -86,9 +88,8 @@
+ // Input: characters
+ // Output: characters, char indices, tags
+ // Returns: output character count
+-le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -124,8 +125,8 @@
+ return count;
+ }
+
+-void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -137,24 +138,20 @@
+ }
+
+ if (fGPOSTable != NULL) {
+- OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count,
+- reverse, glyphStorage, success);
++ OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success);
+ } else if (fGDEFTable != NULL) {
+ GDEFMarkFilter filter(fGDEFTable);
+
+ adjustMarkGlyphs(glyphStorage, &filter, success);
+ } else {
+- GlyphDefinitionTableHeader *gdefTable =
+- (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
++ GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+ GDEFMarkFilter filter(gdefTable);
+
+ adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+ }
+ }
+
+-UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(
+- const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
++UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG)
+ {
+ fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
+@@ -168,8 +165,7 @@
+ }
+
+ // "glyphs", "indices" -> glyphs, indices
+-le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(
+- LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -192,17 +188,14 @@
+
+ glyphStorage.adoptCharIndicesArray(tempGlyphStorage);
+
+- ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE,
+- TRUE, glyphStorage, success);
++ ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE, TRUE, glyphStorage, success);
+
+ LE_DELETE_ARRAY(tempChars);
+
+ return tempGlyphCount;
+ }
+
+-void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -227,9 +220,8 @@
+ }
+ }
+
+-void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_bool reverse,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -244,3 +236,6 @@
+
+ adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+ }
++
++U_NAMESPACE_END
++
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.h b/src/share/native/sun/font/layout/ArabicLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h
+@@ -43,6 +43,8 @@
+ #include "GlyphDefinitionTables.h"
+ #include "GlyphPositioningTables.h"
+
++U_NAMESPACE_BEGIN
++
+ /**
+ * This class implements OpenType layout for Arabic fonts. It overrides
+ * the characerProcessing method to assign the correct OpenType feature
+@@ -71,8 +73,8 @@
+ *
+ * @internal
+ */
+- ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -87,8 +89,8 @@
+ *
+ * @internal
+ */
+- ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, le_int32 typoFlags);
++ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -97,6 +99,20 @@
+ */
+ virtual ~ArabicOpenTypeLayoutEngine();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+
+ /**
+@@ -108,8 +124,7 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the characters are in a
+- * right to left directional run
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
+ *
+ * Output parameters:
+ * @param outChars - the output character arrayt
+@@ -121,9 +136,8 @@
+ *
+ * @internal
+ */
+- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method applies the GPOS table if it is present, otherwise it ensures that all vowel
+@@ -142,11 +156,9 @@
+ *
+ * @internal
+ */
+- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+- // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count,
+- // le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ };
+
+@@ -178,8 +190,8 @@
+ *
+ * @internal
+ */
+- UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
++ UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -208,8 +220,7 @@
+ *
+ * @internal
+ */
+- virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method copies the input characters into the output glyph index array,
+@@ -227,8 +238,7 @@
+ *
+ * @internal
+ */
+- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, le_bool mirror,
++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror,
+ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+@@ -245,8 +255,9 @@
+ *
+ * @internal
+ */
+- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/ArabicShaping.cpp b/src/share/native/sun/font/layout/ArabicShaping.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicShaping.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicShaping.cpp
+@@ -35,6 +35,8 @@
+ #include "LEGlyphStorage.h"
+ #include "ClassDefinitionTables.h"
+
++U_NAMESPACE_BEGIN
++
+ // This table maps Unicode joining types to
+ // ShapeTypes.
+ const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] =
+@@ -102,9 +104,7 @@
+ #define markFeatureMask 0x00040000UL
+ #define mkmkFeatureMask 0x00020000UL
+
+-#define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | \
+- markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | \
+- dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask)
++#define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask)
+
+ #define SHAPE_MASK 0xF0000000UL
+
+@@ -226,3 +226,5 @@
+ adjustTags(erout, 2, glyphStorage);
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ArabicShaping.h b/src/share/native/sun/font/layout/ArabicShaping.h
+--- jdk/src/share/native/sun/font/layout/ArabicShaping.h
++++ jdk/src/share/native/sun/font/layout/ArabicShaping.h
+@@ -32,12 +32,19 @@
+ #ifndef __ARABICSHAPING_H
+ #define __ARABICSHAPING_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+-class ArabicShaping {
++class ArabicShaping /* not : public UObject because all methods are static */ {
+ public:
+ // Joining types
+ enum JoiningTypes
+@@ -74,8 +81,8 @@
+
+ typedef le_int32 ShapeType;
+
+- static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount,
+- le_int32 charMax, le_bool rightToLeft, LEGlyphStorage &glyphStorage);
++ static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax,
++ le_bool rightToLeft, LEGlyphStorage &glyphStorage);
+
+ static const FeatureMap *getFeatureMap(le_int32 &count);
+
+@@ -88,8 +95,8 @@
+ static const le_uint8 shapingTypeTable[];
+ static const ShapeType shapeTypes[];
+
+- static void adjustTags(le_int32 outIndex, le_int32 shapeOffset,
+- LEGlyphStorage &glyphStorage);
++ static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage);
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/AttachmentPosnSubtables.h b/src/share/native/sun/font/layout/AttachmentPosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h
+@@ -32,12 +32,19 @@
+ #ifndef __ATTACHMENTPOSITIONINGSUBTABLES_H
+ #define __ATTACHMENTPOSITIONINGSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphPositioningTables.h"
+ #include "ValueRecords.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct AttachmentPositioningSubtable : GlyphPositioningSubtable
+ {
+ Offset baseCoverageTableOffset;
+@@ -55,4 +62,6 @@
+ return getGlyphCoverage(baseCoverageTableOffset, baseGlyphID);
+ }
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/CanonData.cpp b/src/share/native/sun/font/layout/CanonData.cpp
+--- jdk/src/share/native/sun/font/layout/CanonData.cpp
++++ jdk/src/share/native/sun/font/layout/CanonData.cpp
+@@ -36,6 +36,8 @@
+ #include "LETypes.h"
+ #include "CanonShaping.h"
+
++U_NAMESPACE_BEGIN
++
+ const le_uint8 CanonShaping::glyphSubstitutionTable[] = {
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x58, 0x02, 0x86, 0x00, 0x12, 0x61, 0x72, 0x61, 0x62,
+ 0x00, 0x6E, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65,
+@@ -3773,3 +3775,5 @@
+ 0x00, 0xDC, 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA,
+ 0xD1, 0xAD, 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6
+ };
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CanonShaping.cpp b/src/share/native/sun/font/layout/CanonShaping.cpp
+--- jdk/src/share/native/sun/font/layout/CanonShaping.cpp
++++ jdk/src/share/native/sun/font/layout/CanonShaping.cpp
+@@ -35,8 +35,9 @@
+ #include "GlyphDefinitionTables.h"
+ #include "ClassDefinitionTables.h"
+
+-void CanonShaping::sortMarks(le_int32 *indices,
+- const le_int32 *combiningClasses, le_int32 index, le_int32 limit)
++U_NAMESPACE_BEGIN
++
++void CanonShaping::sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit)
+ {
+ for (le_int32 j = index + 1; j < limit; j += 1) {
+ le_int32 i;
+@@ -55,13 +56,11 @@
+ }
+ }
+
+-void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount,
+- le_bool rightToLeft, LEUnicode *outChars, LEGlyphStorage &glyphStorage)
++void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage)
+ {
+- const GlyphDefinitionTableHeader *gdefTable =
+- (const GlyphDefinitionTableHeader *) glyphDefinitionTable;
+- const ClassDefinitionTable *classTable =
+- gdefTable->getMarkAttachClassDefinitionTable();
++ const GlyphDefinitionTableHeader *gdefTable = (const GlyphDefinitionTableHeader *) glyphDefinitionTable;
++ const ClassDefinitionTable *classTable = gdefTable->getMarkAttachClassDefinitionTable();
+ le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount);
+ le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount);
+ LEErrorCode status = LE_NO_ERROR;
+@@ -103,3 +102,5 @@
+ LE_DELETE_ARRAY(indices);
+ LE_DELETE_ARRAY(combiningClasses);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CanonShaping.h b/src/share/native/sun/font/layout/CanonShaping.h
+--- jdk/src/share/native/sun/font/layout/CanonShaping.h
++++ jdk/src/share/native/sun/font/layout/CanonShaping.h
+@@ -34,20 +34,22 @@
+
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+-class CanonShaping
++class CanonShaping /* not : public UObject because all members are static */
+ {
+ public:
+ static const le_uint8 glyphSubstitutionTable[];
+ static const le_uint8 glyphDefinitionTable[];
+
+- static void reorderMarks(const LEUnicode *inChars, le_int32 charCount,
+- le_bool rightToLeft, LEUnicode *outChars, LEGlyphStorage &glyphStorage);
++ static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage);
+
+ private:
+- static void sortMarks(le_int32 *indices, const le_int32 *combiningClasses,
+- le_int32 index, le_int32 limit);
++ static void sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit);
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/CharSubstitutionFilter.h b/src/share/native/sun/font/layout/CharSubstitutionFilter.h
+--- jdk/src/share/native/sun/font/layout/CharSubstitutionFilter.h
++++ jdk/src/share/native/sun/font/layout/CharSubstitutionFilter.h
+@@ -35,6 +35,8 @@
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEFontInstance;
+
+ /**
+@@ -43,7 +45,7 @@
+ *
+ * @internal
+ */
+-class CharSubstitutionFilter : public LEGlyphFilter
++class CharSubstitutionFilter : public UMemory, public LEGlyphFilter
+ {
+ private:
+ /**
+@@ -98,4 +100,7 @@
+ le_bool accept(LEGlyphID glyph) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.cpp b/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
+--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
+@@ -35,6 +35,8 @@
+ #include "ClassDefinitionTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_int32 ClassDefinitionTable::getGlyphClass(LEGlyphID glyphID) const
+ {
+ switch(SWAPW(classFormat)) {
+@@ -139,3 +141,5 @@
+
+ return FALSE;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.h b/src/share/native/sun/font/layout/ClassDefinitionTables.h
+--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h
++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h
+@@ -32,9 +32,16 @@
+ #ifndef __CLASSDEFINITIONTABLES_H
+ #define __CLASSDEFINITIONTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct ClassDefinitionTable
+ {
+ le_uint16 classFormat;
+@@ -69,4 +76,5 @@
+ le_bool hasGlyphClass(le_int32 glyphClass) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ContextualGlyphInsertion.h b/src/share/native/sun/font/layout/ContextualGlyphInsertion.h
+--- jdk/src/share/native/sun/font/layout/ContextualGlyphInsertion.h
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphInsertion.h
+@@ -32,12 +32,19 @@
+ #ifndef __CONTEXTUALGLYPHINSERTION_H
+ #define __CONTEXTUALGLYPHINSERTION_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+ #include "StateTables.h"
+ #include "MorphTables.h"
+ #include "MorphStateTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct ContextualGlyphInsertionHeader : MorphStateTableHeader
+ {
+ };
+@@ -60,4 +67,5 @@
+ ByteOffset markedInsertionListOffset;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp
+@@ -39,6 +39,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor)
++
+ ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader)
+ : StateTableProcessor(morphSubtableHeader)
+ {
+@@ -57,8 +61,7 @@
+ markGlyph = 0;
+ }
+
+-ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage,
+- le_int32 &currGlyph, EntryTableIndex index)
++ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
+ {
+ const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index];
+ ByteOffset newState = SWAPW(entry->newStateOffset);
+@@ -97,3 +100,5 @@
+ void ContextualGlyphSubstitutionProcessor::endStateTable()
+ {
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h
+--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h
+@@ -32,12 +32,19 @@
+ #ifndef __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H
+ #define __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "StateTableProcessor.h"
+ #include "ContextualGlyphSubstitution.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class ContextualGlyphSubstitutionProcessor : public StateTableProcessor
+@@ -52,6 +59,20 @@
+ ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader);
+ virtual ~ContextualGlyphSubstitutionProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ ContextualGlyphSubstitutionProcessor();
+
+@@ -62,6 +83,8 @@
+ le_int32 markGlyph;
+
+ const ContextualGlyphSubstitutionHeader *contextualGlyphSubstitutionHeader;
++
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h b/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h
+--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h
+@@ -32,11 +32,18 @@
+ #ifndef __CONTEXTUALGLYPHSUBSTITUTION_H
+ #define __CONTEXTUALGLYPHSUBSTITUTION_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+ #include "StateTables.h"
+ #include "MorphTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct ContextualGlyphSubstitutionHeader : MorphStateTableHeader
+ {
+ ByteOffset substitutionTableOffset;
+@@ -55,4 +62,5 @@
+ WordOffset currOffset;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp b/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -39,6 +38,8 @@
+ #include "CoverageTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ /*
+ NOTE: This could be optimized somewhat by keeping track
+ of the previous sequenceIndex in the loop and doing next()
+@@ -350,7 +351,7 @@
+
+ // NOTE: This could be a #define, but that seems to confuse
+ // the Visual Studio .NET 2003 compiler on the calls to the
+-// GlyphIterator constructor. It somehow can't decide if
++// GlyphIterator constructor. It somehow can't decide if
+ // emptyFeatureList matches an le_uint32 or an le_uint16...
+ static const FeatureMask emptyFeatureList = 0x00000000UL;
+
+@@ -542,3 +543,5 @@
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.h b/src/share/native/sun/font/layout/ContextualSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
+@@ -32,6 +32,11 @@
+ #ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H
+ #define __CONTEXTUALSUBSTITUTIONSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "GlyphIterator.h"
+ #include "LookupProcessor.h"
+
++U_NAMESPACE_BEGIN
++
+ struct SubstitutionLookupRecord
+ {
+ le_uint16 sequenceIndex;
+@@ -218,4 +225,5 @@
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/CoverageTables.cpp b/src/share/native/sun/font/layout/CoverageTables.cpp
+--- jdk/src/share/native/sun/font/layout/CoverageTables.cpp
++++ jdk/src/share/native/sun/font/layout/CoverageTables.cpp
+@@ -35,6 +35,8 @@
+ #include "CoverageTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const
+ {
+ switch(SWAPW(coverageFormat))
+@@ -106,3 +108,5 @@
+
+ return startCoverageIndex + (ttGlyphID - firstInRange);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CoverageTables.h b/src/share/native/sun/font/layout/CoverageTables.h
+--- jdk/src/share/native/sun/font/layout/CoverageTables.h
++++ jdk/src/share/native/sun/font/layout/CoverageTables.h
+@@ -32,9 +32,16 @@
+ #ifndef __COVERAGETABLES_H
+ #define __COVERAGETABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct CoverageTable
+ {
+ le_uint16 coverageFormat;
+@@ -58,5 +65,5 @@
+ le_int32 getGlyphCoverage(LEGlyphID glyphID) const;
+ };
+
+-
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
+@@ -37,6 +37,8 @@
+ #include "OpenTypeUtilities.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 CursiveAttachmentSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
+ {
+ LEGlyphID glyphID = glyphIterator->getCurrGlyphID();
+@@ -68,3 +70,5 @@
+
+ return 1;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h
+--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h
++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h
+@@ -32,10 +32,17 @@
+ #ifndef __CURSIVEATTACHMENTSUBTABLES_H
+ #define __CURSIVEATTACHMENTSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphPositioningTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEFontInstance;
+ class GlyphIterator;
+
+@@ -53,4 +60,7 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/DefaultCharMapper.h b/src/share/native/sun/font/layout/DefaultCharMapper.h
+--- jdk/src/share/native/sun/font/layout/DefaultCharMapper.h
++++ jdk/src/share/native/sun/font/layout/DefaultCharMapper.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -32,9 +31,16 @@
+ #ifndef __DEFAULTCHARMAPPER_H
+ #define __DEFAULTCHARMAPPER_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+
++U_NAMESPACE_BEGIN
++
+ /**
+ * This class is an instance of LECharMapper which
+ * implements control character filtering and bidi
+@@ -42,7 +48,7 @@
+ *
+ * @see LECharMapper
+ */
+-class DefaultCharMapper : public LECharMapper
++class DefaultCharMapper : public UMemory, public LECharMapper
+ {
+ private:
+ le_bool fFilterControls;
+@@ -77,4 +83,5 @@
+ LEUnicode32 mapChar(LEUnicode32 ch) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/DeviceTables.cpp b/src/share/native/sun/font/layout/DeviceTables.cpp
+--- jdk/src/share/native/sun/font/layout/DeviceTables.cpp
++++ jdk/src/share/native/sun/font/layout/DeviceTables.cpp
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved
+ *
+ */
+@@ -34,6 +35,8 @@
+ #include "DeviceTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ const le_uint16 DeviceTable::fieldMasks[] = {0x0003, 0x000F, 0x00FF};
+ const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080};
+ const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8};
+@@ -62,3 +65,5 @@
+
+ return result;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/DeviceTables.h b/src/share/native/sun/font/layout/DeviceTables.h
+--- jdk/src/share/native/sun/font/layout/DeviceTables.h
++++ jdk/src/share/native/sun/font/layout/DeviceTables.h
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -32,10 +33,15 @@
+ #ifndef __DEVICETABLES_H
+ #define __DEVICETABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+-#include "GlyphIterator.h"
+-#include "GlyphPositionAdjustments.h"
++
++U_NAMESPACE_BEGIN
+
+ struct DeviceTable
+ {
+@@ -52,5 +58,7 @@
+ static const le_uint16 fieldBits[];
+ };
+
++U_NAMESPACE_END
++#endif
+
+-#endif
++
+diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.cpp b/src/share/native/sun/font/layout/ExtensionSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp
+@@ -25,7 +25,8 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 2003 - All Rights Reserved
++ *
++ * (C) Copyright IBM Corp. 2002 - All Rights Reserved
+ *
+ */
+
+@@ -37,6 +38,9 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++
+ // FIXME: should look at the format too... maybe have a sub-class for it?
+ le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType,
+ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
+@@ -52,3 +56,5 @@
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.h b/src/share/native/sun/font/layout/ExtensionSubtables.h
+--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.h
++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.h
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 2002-2003 - All Rights Reserved
+ *
+ */
+@@ -32,12 +33,19 @@
+ #ifndef __EXTENSIONSUBTABLES_H
+ #define __EXTENSIONSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphSubstitutionTables.h"
+ #include "LookupProcessor.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct ExtensionSubtable //: GlyphSubstitutionSubtable
+ {
+ le_uint16 substFormat;
+@@ -48,4 +56,5 @@
+ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/Features.cpp b/src/share/native/sun/font/layout/Features.cpp
+--- jdk/src/share/native/sun/font/layout/Features.cpp
++++ jdk/src/share/native/sun/font/layout/Features.cpp
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
+ *
+ */
+@@ -35,6 +36,8 @@
+ #include "Features.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ const FeatureTable *FeatureListTable::getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const
+ {
+ if (featureIndex >= SWAPW(featureCount)) {
+@@ -79,3 +82,5 @@
+ return 0;
+ #endif
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/Features.h b/src/share/native/sun/font/layout/Features.h
+--- jdk/src/share/native/sun/font/layout/Features.h
++++ jdk/src/share/native/sun/font/layout/Features.h
+@@ -32,9 +32,16 @@
+ #ifndef __FEATURES_H
+ #define __FEATURES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct FeatureRecord
+ {
+ ATag featureTag;
+@@ -53,9 +60,10 @@
+ le_uint16 featureCount;
+ FeatureRecord featureRecordArray[ANY_NUMBER];
+
+- const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const;
++ const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const;
+
+ const FeatureTable *getFeatureTable(LETag featureTag) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.cpp b/src/share/native/sun/font/layout/GDEFMarkFilter.cpp
+--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp
++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp
+@@ -34,6 +34,8 @@
+ #include "GDEFMarkFilter.h"
+ #include "GlyphDefinitionTables.h"
+
++U_NAMESPACE_BEGIN
++
+ GDEFMarkFilter::GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable)
+ {
+ classDefTable = gdefTable->getGlyphClassDefinitionTable();
+@@ -50,3 +52,5 @@
+
+ return glyphClass == gcdMarkGlyph;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.h b/src/share/native/sun/font/layout/GDEFMarkFilter.h
+--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h
++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h
+@@ -32,11 +32,18 @@
+ #ifndef __GDEFMARKFILTER__H
+ #define __GDEFMARKFILTER__H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "GlyphDefinitionTables.h"
+
+-class GDEFMarkFilter : public LEGlyphFilter
++U_NAMESPACE_BEGIN
++
++class GDEFMarkFilter : public UMemory, public LEGlyphFilter
+ {
+ private:
+ const GlyphClassDefinitionTable *classDefTable;
+@@ -51,5 +58,5 @@
+ virtual le_bool accept(LEGlyphID glyph) const;
+ };
+
+-
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.cpp b/src/share/native/sun/font/layout/GXLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp
+@@ -23,6 +23,7 @@
+ *
+ */
+
++
+ /*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+@@ -36,8 +37,11 @@
+
+ #include "MorphTables.h"
+
+-GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, const MorphTableHeader *morphTable)
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine)
++
++GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable)
+ : LayoutEngine(fontInstance, scriptCode, languageCode, 0), fMorphTable(morphTable)
+ {
+ // nothing else to do?
+@@ -49,9 +53,7 @@
+ }
+
+ // apply 'mort' table
+-le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage,
+- LEErrorCode &success)
++le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -74,9 +76,8 @@
+ }
+
+ // apply positional tables
+-void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_bool /*reverse*/,
+- LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success)
++void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/,
++ LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -89,3 +90,5 @@
+
+ // FIXME: no positional processing yet...
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.h b/src/share/native/sun/font/layout/GXLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.h
+@@ -23,6 +23,7 @@
+ *
+ */
+
++
+ /*
+ *
+ * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
+@@ -37,6 +38,8 @@
+
+ #include "MorphTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEFontInstance;
+ class LEGlyphStorage;
+
+@@ -70,8 +73,7 @@
+ *
+ * @internal
+ */
+- GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, const MorphTableHeader *morphTable);
++ GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -80,6 +82,20 @@
+ */
+ virtual ~GXLayoutEngine();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+
+ /**
+@@ -99,10 +115,8 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the text is in a
+- * right to left directional run
+- * @param glyphStorage - the glyph storage object. The glyph
+- * and char index arrays will be set.
++ * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run
++ * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+@@ -111,8 +125,7 @@
+ *
+ * @internal
+ */
+- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+@@ -120,16 +133,18 @@
+ * 'kern', 'trak', 'bsln', 'opbd' and 'just' tables.
+ *
+ * Input parameters:
+- * @param glyphStorage - the object holding the glyph storage.
+- * The positions will be updated as needed.
++ * @param glyphStorage - the object holding the glyph storage. The positions will be updated as needed.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+ *
+ * @internal
+ */
+- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success);
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp b/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp
+@@ -34,6 +34,8 @@
+ #include "GlyphDefinitionTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ const GlyphClassDefinitionTable *GlyphDefinitionTableHeader::getGlyphClassDefinitionTable() const
+ {
+ return (const GlyphClassDefinitionTable *) ((char *) this + SWAPW(glyphClassDefOffset));
+@@ -53,3 +55,5 @@
+ {
+ return (const MarkAttachClassDefinitionTable *) ((char *) this + SWAPW(MarkAttachClassDefOffset));
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.h b/src/share/native/sun/font/layout/GlyphDefinitionTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h
+@@ -32,10 +32,17 @@
+ #ifndef __GLYPHDEFINITIONTABLES_H
+ #define __GLYPHDEFINITIONTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "ClassDefinitionTables.h"
+
++U_NAMESPACE_BEGIN
++
+ typedef ClassDefinitionTable GlyphClassDefinitionTable;
+
+ enum GlyphClassDefinitions
+@@ -110,4 +117,5 @@
+ const MarkAttachClassDefinitionTable *getMarkAttachClassDefinitionTable() const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GlyphIterator.cpp b/src/share/native/sun/font/layout/GlyphIterator.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphIterator.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphIterator.cpp
+@@ -38,11 +38,10 @@
+ #include "Lookups.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
+
+-GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage,
+- GlyphPositionAdjustments *theGlyphPositionAdjustments,
+- le_bool rightToLeft, le_uint16 theLookupFlags, FeatureMask theFeatureMask,
+- const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
++GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
++ FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
+ : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
+ glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
+ srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask),
+@@ -262,8 +261,8 @@
+ glyphPositionAdjustments->setBaseOffset(position, baseOffset);
+ }
+
+-void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust,
+- float yPlacementAdjust, float xAdvanceAdjust, float yAdvanceAdjust)
++void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
++ float xAdvanceAdjust, float yAdvanceAdjust)
+ {
+ if (direction < 0) {
+ if (position <= nextLimit || position >= prevLimit) {
+@@ -281,8 +280,8 @@
+ glyphPositionAdjustments->adjustYAdvance(position, yAdvanceAdjust);
+ }
+
+-void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust,
+- float yPlacementAdjust, float xAdvanceAdjust, float yAdvanceAdjust)
++void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
++ float xAdvanceAdjust, float yAdvanceAdjust)
+ {
+ if (direction < 0) {
+ if (position <= nextLimit || position >= prevLimit) {
+@@ -484,10 +483,11 @@
+
+ do {
+ newPosition -= direction;
+- } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE &&
+- filterGlyph(newPosition));
++ } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition));
+
+ position = newPosition;
+
+ return position != prevLimit;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphIterator.h b/src/share/native/sun/font/layout/GlyphIterator.h
+--- jdk/src/share/native/sun/font/layout/GlyphIterator.h
++++ jdk/src/share/native/sun/font/layout/GlyphIterator.h
+@@ -32,26 +32,24 @@
+ #ifndef __GLYPHITERATOR_H
+ #define __GLYPHITERATOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphDefinitionTables.h"
+
+-struct InsertionRecord
+-{
+- InsertionRecord *next;
+- le_int32 position;
+- le_int32 count;
+- LEGlyphID glyphs[ANY_NUMBER];
+-};
++U_NAMESPACE_BEGIN
+
+ class LEGlyphStorage;
+ class GlyphPositionAdjustments;
+
+-class GlyphIterator {
++class GlyphIterator : public UMemory {
+ public:
+- GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments,
+- le_bool rightToLeft, le_uint16 theLookupFlags, FeatureMask theFeatureMask,
+- const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader);
++ GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
++ FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader);
+
+ GlyphIterator(GlyphIterator &that);
+
+@@ -122,4 +120,5 @@
+ GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.cpp b/src/share/native/sun/font/layout/GlyphLookupTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp
+@@ -35,6 +35,8 @@
+ #include "GlyphLookupTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_bool GlyphLookupTableHeader::coversScript(LETag scriptTag) const
+ {
+ const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset));
+@@ -51,3 +53,5 @@
+ // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero.
+ return langSysTable != NULL && langSysTable->featureCount != 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.h b/src/share/native/sun/font/layout/GlyphLookupTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.h
+@@ -32,9 +32,16 @@
+ #ifndef __GLYPHLOOKUPTABLES_H
+ #define __GLYPHLOOKUPTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct GlyphLookupTableHeader
+ {
+ fixed32 version;
+@@ -46,4 +53,7 @@
+ le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const;
+ };
+
++U_NAMESPACE_END
++
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp b/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp
+@@ -34,6 +34,8 @@
+ #include "LEGlyphStorage.h"
+ #include "LEFontInstance.h"
+
++U_NAMESPACE_BEGIN
++
+ #define CHECK_ALLOCATE_ARRAY(array, type, size) \
+ if (array == NULL) { \
+ array = (type *) new type[size]; \
+@@ -185,3 +187,5 @@
+
+ return NULL;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.h b/src/share/native/sun/font/layout/GlyphPositionAdjustments.h
+--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h
++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h
+@@ -32,16 +32,23 @@
+ #ifndef __GLYPHPOSITIONADJUSTMENTS_H
+ #define __GLYPHPOSITIONADJUSTMENTS_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+ class LEFontInstance;
+
+-class GlyphPositionAdjustments
++class GlyphPositionAdjustments : public UMemory
+ {
+ private:
+- class Adjustment {
++ class Adjustment : public UMemory {
+ public:
+
+ inline Adjustment();
+@@ -78,7 +85,7 @@
+ // allow copying of this class because all of its fields are simple types
+ };
+
+- class EntryExitPoint
++ class EntryExitPoint : public UMemory
+ {
+ public:
+ inline EntryExitPoint();
+@@ -144,14 +151,11 @@
+ inline void adjustXAdvance(le_int32 index, float xAdjustment);
+ inline void adjustYAdvance(le_int32 index, float yAdjustment);
+
+- void setEntryPoint(le_int32 index, LEPoint &newEntryPoint,
+- le_bool baselineIsLogicalEnd);
+- void setExitPoint(le_int32 index, LEPoint &newExitPoint,
+- le_bool baselineIsLogicalEnd);
++ void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
++ void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
+ void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd);
+
+- void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft,
+- const LEFontInstance *fontInstance);
++ void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance);
+ };
+
+ inline GlyphPositionAdjustments::Adjustment::Adjustment()
+@@ -160,10 +164,8 @@
+ // nothing else to do!
+ }
+
+-inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace,
+- float xAdv, float yAdv, le_int32 baseOff)
+- : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv),
+- baseOffset(baseOff)
++inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff)
++ : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff)
+ {
+ // nothing else to do!
+ }
+@@ -246,7 +248,7 @@
+ inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint()
+ : fFlags(0)
+ {
+- fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fEntryPoint.fY = 0;
++ fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0;
+ }
+
+ inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint()
+@@ -264,12 +266,10 @@
+ return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0;
+ }
+
+-inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(
+- LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
++inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
+ {
+ if (baselineIsLogicalEnd) {
+- fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH |
+- EEF_BASELINE_IS_LOGICAL_END);
++ fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
+ } else {
+ fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH);
+ }
+@@ -277,12 +277,10 @@
+ fEntryPoint = newEntryPoint;
+ }
+
+-inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(
+- LEPoint &newExitPoint, le_bool baselineIsLogicalEnd)
++inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd)
+ {
+ if (baselineIsLogicalEnd) {
+- fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH |
+- EEF_BASELINE_IS_LOGICAL_END);
++ fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
+ } else {
+ fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH);
+ }
+@@ -290,8 +288,7 @@
+ fExitPoint = newExitPoint;
+ }
+
+-inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(
+- le_bool baselineIsLogicalEnd)
++inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd)
+ {
+ if (baselineIsLogicalEnd) {
+ fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
+@@ -386,4 +383,5 @@
+ return fEntryExitPoints != NULL;
+ }
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.cpp b/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -40,18 +39,18 @@
+ #include "LEGlyphStorage.h"
+ #include "GlyphPositionAdjustments.h"
+
+-void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage,
+- GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft,
+- LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEFontInstance *fontInstance,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const
++U_NAMESPACE_BEGIN
++
++void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft,
++ LETag scriptTag, LETag languageTag,
++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const
+ {
+- GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap,
+- featureMapCount, featureOrder);
++ GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder);
+
+- processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft,
+- glyphDefinitionTableHeader, fontInstance);
++ processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance);
+
+ glyphPositionAdjustments->applyCursiveAdjustments(glyphStorage, rightToLeft, fontInstance);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.h b/src/share/native/sun/font/layout/GlyphPositioningTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -32,11 +31,18 @@
+ #ifndef __GLYPHPOSITIONINGTABLES_H
+ #define __GLYPHPOSITIONINGTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "Lookups.h"
+ #include "GlyphLookupTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEFontInstance;
+ class LEGlyphStorage;
+ class LEGlyphFilter;
+@@ -45,12 +51,10 @@
+
+ struct GlyphPositioningTableHeader : public GlyphLookupTableHeader
+ {
+- void process(LEGlyphStorage &glyphStorage,
+- GlyphPositionAdjustments *glyphPositionAdjustments,
++ void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+ le_bool rightToLeft, LETag scriptTag, LETag languageTag,
+ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEFontInstance *fontInstance,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const;
++ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const;
+ };
+
+ enum GlyphPositioningSubtableTypes
+@@ -68,4 +72,5 @@
+
+ typedef LookupSubtable GlyphPositioningSubtable;
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp b/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved
+ *
+ */
+@@ -50,6 +49,8 @@
+ #include "GlyphPosnLookupProc.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ // Aside from the names, the contextual positioning subtables are
+ // the same as the contextual substitution subtables.
+ typedef ContextualSubstitutionSubtable ContextualPositioningSubtable;
+@@ -57,8 +58,7 @@
+
+ GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor(
+ const GlyphPositioningTableHeader *glyphPositioningTableHeader,
+- LETag scriptTag, LETag languageTag,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder)
++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder)
+ : LookupProcessor(
+ (char *) glyphPositioningTableHeader,
+ SWAPW(glyphPositioningTableHeader->scriptListOffset),
+@@ -166,3 +166,5 @@
+ GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor()
+ {
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.h b/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
+--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -32,6 +31,11 @@
+ #ifndef __GLYPHPOSITIONINGLOOKUPPROCESSOR_H
+ #define __GLYPHPOSITIONINGLOOKUPPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -42,12 +46,13 @@
+ #include "GlyphIterator.h"
+ #include "LookupProcessor.h"
+
++U_NAMESPACE_BEGIN
++
+ class GlyphPositioningLookupProcessor : public LookupProcessor
+ {
+ public:
+ GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader,
+- LETag scriptTag, LETag languageTag,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder);
++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder);
+
+ virtual ~GlyphPositioningLookupProcessor();
+
+@@ -63,4 +68,5 @@
+ GlyphPositioningLookupProcessor &operator=(const GlyphPositioningLookupProcessor &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp b/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
+@@ -48,17 +48,17 @@
+ #include "GlyphSubstLookupProc.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor(
+ const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader,
+- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder)
++ LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder)
+ : LookupProcessor(
+ (char *) glyphSubstitutionTableHeader,
+ SWAPW(glyphSubstitutionTableHeader->scriptListOffset),
+ SWAPW(glyphSubstitutionTableHeader->featureListOffset),
+ SWAPW(glyphSubstitutionTableHeader->lookupListOffset),
+- scriptTag, languageTag, featureMap, featureMapCount, featureOrder)
+- , fFilter(filter)
++ scriptTag, languageTag, featureMap, featureMapCount, featureOrder), fFilter(filter)
+ {
+ // anything?
+ }
+@@ -143,3 +143,5 @@
+ GlyphSubstitutionLookupProcessor::~GlyphSubstitutionLookupProcessor()
+ {
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.h b/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
+--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -32,6 +31,11 @@
+ #ifndef __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H
+ #define __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "LEFontInstance.h"
+@@ -43,12 +47,13 @@
+ #include "GlyphIterator.h"
+ #include "LookupProcessor.h"
+
++U_NAMESPACE_BEGIN
++
+ class GlyphSubstitutionLookupProcessor : public LookupProcessor
+ {
+ public:
+ GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader,
+- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder);
++ LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder);
+
+ virtual ~GlyphSubstitutionLookupProcessor();
+
+@@ -65,4 +70,5 @@
+ GlyphSubstitutionLookupProcessor &operator=(const GlyphSubstitutionLookupProcessor &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp b/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
+@@ -40,14 +40,15 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
+-le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage,
+- le_bool rightToLeft, LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEGlyphFilter *filter, const FeatureMap *featureMap,
+- le_int32 featureMapCount, le_bool featureOrder) const
++U_NAMESPACE_BEGIN
++
++le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag,
++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const
+ {
+- GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap,
+- featureMapCount, featureOrder);
++ GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder);
+
+ return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.h b/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
+@@ -32,22 +32,27 @@
+ #ifndef __GLYPHSUBSTITUTIONTABLES_H
+ #define __GLYPHSUBSTITUTIONTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+ #include "Lookups.h"
+ #include "GlyphLookupTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+ class LEGlyphFilter;
+ struct GlyphDefinitionTableHeader;
+
+ struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader
+ {
+- le_int32 process(LEGlyphStorage &glyphStorage,
+- le_bool rightToLeft, LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEGlyphFilter *filter, const FeatureMap *featureMap,
+- le_int32 featureMapCount, le_bool featureOrder) const;
++ le_int32 process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag,
++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEGlyphFilter *filter,
++ const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const;
+ };
+
+ enum GlyphSubstitutionSubtableTypes
+@@ -64,4 +69,5 @@
+
+ typedef LookupSubtable GlyphSubstitutionSubtable;
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.cpp b/src/share/native/sun/font/layout/HanLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * HanLayoutEngine.cpp: OpenType processing for Han fonts.
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved.
+@@ -41,6 +40,10 @@
+ #include "LEGlyphStorage.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HanOpenTypeLayoutEngine)
++
+ #define loclFeatureTag LE_LOCL_FEATURE_TAG
+ #define smplFeatureTag LE_SMPL_FEATURE_TAG
+ #define tradFeatureTag LE_TRAD_FEATURE_TAG
+@@ -60,9 +63,8 @@
+
+ #define features (loclFeatureMask)
+
+-HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags,
+- const GlyphSubstitutionTableHeader *gsubTable)
++HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
+ {
+ fFeatureMap = featureMap;
+@@ -74,9 +76,8 @@
+ // nothing to do
+ }
+
+-le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/,
+- LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/,
++ LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -104,3 +105,5 @@
+
+ return count;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.h b/src/share/native/sun/font/layout/HanLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.h
+@@ -23,8 +23,8 @@
+ *
+ */
+
++
+ /*
+- *
+ * HanLayoutEngine.h: OpenType processing for Han fonts.
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved.
+@@ -40,6 +40,8 @@
+
+ #include "GlyphSubstitutionTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ /**
+@@ -69,9 +71,8 @@
+ *
+ * @internal
+ */
+- HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
+
+
+ /**
+@@ -81,6 +82,20 @@
+ */
+ virtual ~HanOpenTypeLayoutEngine();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+
+ /**
+@@ -92,10 +107,8 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the characters are in a
+- * right to left directional run
+- * @param glyphStorage - the object holding the glyph storage. The char
+- * index and auxillary data arrays will be set.
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
++ * @param glyphStorage - the object holding the glyph storage. The char index and auxillary data arrays will be set.
+ *
+ * Output parameters:
+ * @param outChars - the output character arrayt
+@@ -107,9 +120,10 @@
+ *
+ * @internal
+ */
+- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/IndicClassTables.cpp b/src/share/native/sun/font/layout/IndicClassTables.cpp
+--- jdk/src/share/native/sun/font/layout/IndicClassTables.cpp
++++ jdk/src/share/native/sun/font/layout/IndicClassTables.cpp
+@@ -35,6 +35,8 @@
+ #include "OpenTypeUtilities.h"
+ #include "IndicReordering.h"
+
++U_NAMESPACE_BEGIN
++
+ // Split matra table indices
+ #define _x1 (1 << CF_INDEX_SHIFT)
+ #define _x2 (2 << CF_INDEX_SHIFT)
+@@ -385,3 +387,5 @@
+
+ return classTable->getWorstCaseExpansion();
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
+@@ -45,20 +45,20 @@
+
+ #include "IndicReordering.h"
+
+-IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags,
+- const GlyphSubstitutionTableHeader *gsubTable)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable),
+- fMPreFixups(NULL)
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine)
++
++IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable), fMPreFixups(NULL)
+ {
+ fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+ }
+
+-IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags),
+- fMPreFixups(NULL)
++IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fMPreFixups(NULL)
+ {
+ fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+@@ -71,9 +71,8 @@
+
+ // Input: characters, tags
+ // Output: glyphs, char indices
+-le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -84,8 +83,7 @@
+ return 0;
+ }
+
+- le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max,
+- rightToLeft, glyphStorage, success);
++ le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success);
+
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -99,9 +97,8 @@
+ // Input: characters
+ // Output: characters, char indices, tags
+ // Returns: output character count
+-le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -131,9 +128,10 @@
+
+ // NOTE: assumes this allocates featureTags...
+ // (probably better than doing the worst case stuff here...)
+- le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode,
+- outChars, glyphStorage, &fMPreFixups);
++ le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups);
++
+ glyphStorage.adoptGlyphCount(outCharCount);
+-
+ return outCharCount;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.h b/src/share/native/sun/font/layout/IndicLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h
+@@ -43,6 +43,8 @@
+ #include "GlyphDefinitionTables.h"
+ #include "GlyphPositioningTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class MPreFixups;
+ class LEGlyphStorage;
+
+@@ -77,9 +79,8 @@
+ *
+ * @internal
+ */
+- IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -94,8 +95,8 @@
+ *
+ * @internal
+ */
+- IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
++ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -104,6 +105,20 @@
+ */
+ virtual ~IndicOpenTypeLayoutEngine();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+
+ /**
+@@ -117,10 +132,9 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the characters are in a
+- * right to left directional run
+- * @param glyphStorage - the glyph storage object. The glyph and character
+- * index arrays will be set. The auxillary data array will be set to the feature tags.
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set.
++ * the auxillary data array will be set to the feature tags.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+@@ -129,9 +143,8 @@
+ *
+ * @internal
+ */
+- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method does character to glyph mapping, applies the GSUB table and applies
+@@ -147,11 +160,9 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the characters are in a
+- * right to left directional run
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
+ * @param featureTags - the feature tag array
+- * @param glyphStorage - the glyph storage object. The glyph and char
+- * index arrays will be set.
++ * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+@@ -163,12 +174,14 @@
+ *
+ * @internal
+ */
+- virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage,
+- LEErrorCode &success);
++ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ private:
++
+ MPreFixups *fMPreFixups;
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/IndicRearrangement.h b/src/share/native/sun/font/layout/IndicRearrangement.h
+--- jdk/src/share/native/sun/font/layout/IndicRearrangement.h
++++ jdk/src/share/native/sun/font/layout/IndicRearrangement.h
+@@ -32,12 +32,19 @@
+ #ifndef __INDICREARRANGEMENT_H
+ #define __INDICREARRANGEMENT_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+ #include "StateTables.h"
+ #include "MorphTables.h"
+ #include "MorphStateTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct IndicRearrangementSubtableHeader : MorphStateTableHeader
+ {
+ };
+@@ -78,4 +85,6 @@
+ {
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp b/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp
+@@ -39,6 +39,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor)
++
+ IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader)
+ : StateTableProcessor(morphSubtableHeader)
+ {
+@@ -56,8 +60,7 @@
+ lastGlyph = 0;
+ }
+
+-ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage,
+- le_int32 &currGlyph, EntryTableIndex index)
++ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
+ {
+ const IndicRearrangementStateEntry *entry = &entryTable[index];
+ ByteOffset newState = SWAPW(entry->newStateOffset);
+@@ -416,3 +419,5 @@
+ break;
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.h b/src/share/native/sun/font/layout/IndicRearrangementProcessor.h
+--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h
++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h
+@@ -32,12 +32,19 @@
+ #ifndef __INDICREARRANGEMENTPROCESSOR_H
+ #define __INDICREARRANGEMENTPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "StateTableProcessor.h"
+ #include "IndicRearrangement.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class IndicRearrangementProcessor : public StateTableProcessor
+@@ -54,12 +61,28 @@
+ IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader);
+ virtual ~IndicRearrangementProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+ le_int32 firstGlyph;
+ le_int32 lastGlyph;
+
+ const IndicRearrangementStateEntry *entryTable;
+ const IndicRearrangementSubtableHeader *indicRearrangementSubtableHeader;
++
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/IndicReordering.cpp b/src/share/native/sun/font/layout/IndicReordering.cpp
+--- jdk/src/share/native/sun/font/layout/IndicReordering.cpp
++++ jdk/src/share/native/sun/font/layout/IndicReordering.cpp
+@@ -36,6 +36,8 @@
+ #include "LEGlyphStorage.h"
+ #include "MPreFixups.h"
+
++U_NAMESPACE_BEGIN
++
+ #define initFeatureTag LE_INIT_FEATURE_TAG
+ #define nuktFeatureTag LE_NUKT_FEATURE_TAG
+ #define akhnFeatureTag LE_AKHN_FEATURE_TAG
+@@ -71,7 +73,7 @@
+ #define distFeatureMask 0x00020000UL
+ #define initFeatureMask 0x00010000UL
+
+-class ReorderingOutput {
++class ReorderingOutput : public UMemory {
+ private:
+ le_int32 fOutIndex;
+ LEUnicode *fOutChars;
+@@ -187,8 +189,7 @@
+ fOutIndex += 1;
+ }
+
+- le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex,
+- FeatureMask matraFeatures, le_bool wordStart)
++ le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, FeatureMask matraFeatures, le_bool wordStart)
+ {
+ IndicClassTable::CharClass matraClass = classTable->getCharClass(matra);
+
+@@ -219,13 +220,12 @@
+ return FALSE;
+ }
+
+- void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier,
+- le_uint32 vowelModifierIndex, FeatureMask vowelModifierFeatures)
++ void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier, le_uint32 vowelModifierIndex, FeatureMask vowelModifierFeatures)
+ {
+ IndicClassTable::CharClass vmClass = classTable->getCharClass(vowelModifier);
+
+ fVMIndex = vowelModifierIndex;
+- fVMFeatures = vowelModifierFeatures;
++ fVMFeatures = vowelModifierFeatures;
+
+ if (IndicClassTable::isVowelModifier(vmClass)) {
+ switch (vmClass & CF_POS_MASK) {
+@@ -244,13 +244,12 @@
+ }
+ }
+
+- void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark,
+- le_uint32 stressMarkIndex, FeatureMask stressMarkFeatures)
++ void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark, le_uint32 stressMarkIndex, FeatureMask stressMarkFeatures)
+ {
+ IndicClassTable::CharClass smClass = classTable->getCharClass(stressMark);
+
+ fSMIndex = stressMarkIndex;
+- fSMFeatures = stressMarkFeatures;
++ fSMFeatures = stressMarkFeatures;
+
+ if (IndicClassTable::isStressMark(smClass)) {
+ switch (smClass & CF_POS_MASK) {
+@@ -360,9 +359,7 @@
+ };
+
+ // TODO: Find better names for these!
+-#define tagArray4 (nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | \
+- blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | \
+- blwmFeatureMask | abvmFeatureMask | distFeatureMask)
++#define tagArray4 (nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask)
+ #define tagArray3 (pstfFeatureMask | tagArray4)
+ #define tagArray2 (halfFeatureMask | tagArray3)
+ #define tagArray1 (blwfFeatureMask | tagArray2)
+@@ -415,8 +412,7 @@
+ return featureMap;
+ }
+
+-le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable,
+- const LEUnicode *chars, le_int32 prev, le_int32 charCount)
++le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount)
+ {
+ le_int32 cursor = prev;
+ le_int8 state = 0;
+@@ -752,3 +748,5 @@
+ delete mpreFixups;
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicReordering.h b/src/share/native/sun/font/layout/IndicReordering.h
+--- jdk/src/share/native/sun/font/layout/IndicReordering.h
++++ jdk/src/share/native/sun/font/layout/IndicReordering.h
+@@ -32,9 +32,16 @@
+ #ifndef __INDICREORDERING_H
+ #define __INDICREORDERING_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ // Characters that get refered to by name...
+ #define C_SIGN_ZWNJ 0x200C
+ #define C_SIGN_ZWJ 0x200D
+@@ -140,7 +147,7 @@
+ static const IndicClassTable *getScriptClassTable(le_int32 scriptCode);
+ };
+
+-class IndicReordering {
++class IndicReordering /* not : public UObject because all methods are static */ {
+ public:
+ static le_int32 getWorstCaseExpansion(le_int32 scriptCode);
+
+@@ -156,8 +163,7 @@
+ // do not instantiate
+ IndicReordering();
+
+- static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars,
+- le_int32 prev, le_int32 charCount);
++ static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount);
+
+ };
+
+@@ -305,4 +311,5 @@
+ return hasBelowBaseForm(getCharClass(ch));
+ }
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp
+--- jdk/src/share/native/sun/font/layout/KernTable.cpp
++++ jdk/src/share/native/sun/font/layout/KernTable.cpp
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved
+ *
+ */
+@@ -39,6 +40,8 @@
+
+ #define DEBUG 0
+
++U_NAMESPACE_BEGIN
++
+ struct PairInfo {
+ le_uint32 key; // sigh, MSVC compiler gags on union here
+ le_int16 value; // fword, kern value in funits
+@@ -191,6 +194,12 @@
+ float adjust = 0;
+ for (int i = 1, e = storage.getGlyphCount(); i < e; ++i) {
+ key = key << 16 | (storage[i] & 0xffff);
++
++ // argh, to do a binary search, we need to have the pair list in sorted order
++ // but it is not in sorted order on win32 platforms because of the endianness difference
++ // so either I have to swap the element each time I examine it, or I have to swap
++ // all the elements ahead of time and store them in the font
++
+ const PairInfo* p = pairs;
+ const PairInfo* tp = (const PairInfo*)(p + rangeShift);
+ if (key > tp->key) {
+@@ -238,3 +247,6 @@
+ storage.adjustPosition(storage.getGlyphCount(), adjust, 0, success);
+ }
+ }
++
++U_NAMESPACE_END
++
+diff --git a/src/share/native/sun/font/layout/KernTable.h b/src/share/native/sun/font/layout/KernTable.h
+--- jdk/src/share/native/sun/font/layout/KernTable.h
++++ jdk/src/share/native/sun/font/layout/KernTable.h
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved
+ *
+ */
+@@ -37,9 +38,12 @@
+ #endif
+
+ #include "LETypes.h"
++//#include "LEFontInstance.h"
++//#include "LEGlyphStorage.h"
+
+ #include <stdio.h>
+
++U_NAMESPACE_BEGIN
+ struct PairInfo;
+ class LEFontInstance;
+ class LEGlyphStorage;
+@@ -67,4 +71,6 @@
+ void process(LEGlyphStorage& storage);
+ };
+
++U_NAMESPACE_END
++
+ #endif
+diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp b/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
+@@ -23,8 +23,8 @@
+ *
+ */
+
++
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ * This file is a modification of the ICU file IndicLayoutEngine.cpp
+@@ -38,17 +38,20 @@
+ #include "LEGlyphStorage.h"
+ #include "KhmerReordering.h"
+
+-KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags,
+- const GlyphSubstitutionTableHeader *gsubTable)
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine)
++
++KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
+ {
+ fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+ }
+
+-KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
++KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
+ {
+ fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount);
+@@ -63,16 +66,14 @@
+ // Input: characters
+ // Output: characters, char indices, tags
+ // Returns: output character count
+-le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+
+- if (chars == NULL || offset < 0 || count < 0 || max < 0 ||
+- offset >= max || offset + count > max) {
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+ success = LE_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+@@ -96,9 +97,10 @@
+
+ // NOTE: assumes this allocates featureTags...
+ // (probably better than doing the worst case stuff here...)
+- le_int32 outCharCount = KhmerReordering::reorder(&chars[offset], count,
+- fScriptCode, outChars, glyphStorage);
++ le_int32 outCharCount = KhmerReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage);
+
+ glyphStorage.adoptGlyphCount(outCharCount);
+ return outCharCount;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.h b/src/share/native/sun/font/layout/KhmerLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h
+@@ -23,6 +23,7 @@
+ *
+ */
+
++
+ /*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+@@ -45,19 +46,18 @@
+ // #include "GlyphDefinitionTables.h"
+ // #include "GlyphPositioningTables.h"
+
++U_NAMESPACE_BEGIN
++
+ // class MPreFixups;
+ // class LEGlyphStorage;
+
+ /**
+ * This class implements OpenType layout for Khmer OpenType fonts, as
+- * specified by Microsoft in "Creating and Supporting OpenType Fonts
+- * for Khmer Scripts"
+- * (http://www.microsoft.com/typography/otspec/indicot/default.htm)
+- * TODO: change url
++ * specified by Microsoft in "Creating and Supporting OpenType Fonts for
++ * Khmer Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm) TODO: change url
+ *
+- * This class overrides the characterProcessing method to do Khmer
+- * character processing and reordering (See the MS spec. for more
+- * details)
++ * This class overrides the characterProcessing method to do Khmer character processing
++ * and reordering (See the MS spec. for more details)
+ *
+ * @internal
+ */
+@@ -65,11 +65,10 @@
+ {
+ public:
+ /**
+- * This is the main constructor. It constructs an instance of
+- * KhmerOpenTypeLayoutEngine for a particular font, script and
+- * language. It takes the GSUB table as a parameter since
+- * LayoutEngine::layoutEngineFactory has to read the GSUB table to
+- * know that it has an Khmer OpenType font.
++ * This is the main constructor. It constructs an instance of KhmerOpenTypeLayoutEngine for
++ * a particular font, script and language. It takes the GSUB table as a parameter since
++ * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an
++ * Khmer OpenType font.
+ *
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+@@ -82,14 +81,12 @@
+ *
+ * @internal
+ */
+- KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags,
+- const GlyphSubstitutionTableHeader *gsubTable);
++ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
+
+ /**
+- * This constructor is used when the font requires a "canned" GSUB
+- * table which can't be known until after this constructor has
+- * been invoked.
++ * This constructor is used when the font requires a "canned" GSUB table which can't be known
++ * until after this constructor has been invoked.
+ *
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+@@ -100,8 +97,8 @@
+ *
+ * @internal
+ */
+- KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
++ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -110,25 +107,35 @@
+ */
+ virtual ~KhmerOpenTypeLayoutEngine();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+
+ /**
+- * This method does Khmer OpenType character processing. It
+- * assigns the OpenType feature tags to the characters, and may
+- * generate output characters which have been reordered. It may
+- * also split some vowels, resulting in more output characters
+- * than input characters.
++ * This method does Khmer OpenType character processing. It assigns the OpenType feature
++ * tags to the characters, and may generate output characters which have been reordered.
++ * It may also split some vowels, resulting in more output characters than input characters.
+ *
+ * Input parameters:
+ * @param chars - the input character context
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the characters are in
+- * a right to left directional run
+- * @param glyphStorage - the glyph storage object. The glyph and
+- * character index arrays will be set. the auxillary data array
+- * will be set to the feature tags.
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set.
++ * the auxillary data array will be set to the feature tags.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+@@ -137,9 +144,11 @@
+ *
+ * @internal
+ */
+- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/KhmerReordering.cpp b/src/share/native/sun/font/layout/KhmerReordering.cpp
+--- jdk/src/share/native/sun/font/layout/KhmerReordering.cpp
++++ jdk/src/share/native/sun/font/layout/KhmerReordering.cpp
+@@ -37,6 +37,9 @@
+ #include "KhmerReordering.h"
+ #include "LEGlyphStorage.h"
+
++
++U_NAMESPACE_BEGIN
++
+ // Characters that get refered to by name...
+ enum
+ {
+@@ -53,35 +56,23 @@
+
+ enum
+ {
+- // simple classes, they are used in the statetable (in this file)
+- // to control the length of a syllable they are also used to know
+- // where a character should be placed (location in reference to
+- // the base character) and also to know if a character, when
+- // independtly displayed, should be displayed with a dotted-circle
+- // to indicate error in syllable construction
+-
++ // simple classes, they are used in the statetable (in this file) to control the length of a syllable
++ // they are also used to know where a character should be placed (location in reference to the base character)
++ // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to
++ // indicate error in syllable construction
+ _xx = KhmerClassTable::CC_RESERVED,
+- _sa = KhmerClassTable::CC_SIGN_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE
+- | KhmerClassTable::CF_POS_ABOVE,
+- _sp = KhmerClassTable::CC_SIGN_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE
+- | KhmerClassTable::CF_POS_AFTER,
++ _sa = KhmerClassTable::CC_SIGN_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_POS_ABOVE,
++ _sp = KhmerClassTable::CC_SIGN_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE| KhmerClassTable::CF_POS_AFTER,
+ _c1 = KhmerClassTable::CC_CONSONANT | KhmerClassTable::CF_CONSONANT,
+ _c2 = KhmerClassTable::CC_CONSONANT2 | KhmerClassTable::CF_CONSONANT,
+ _c3 = KhmerClassTable::CC_CONSONANT3 | KhmerClassTable::CF_CONSONANT,
+- _rb = KhmerClassTable::CC_ROBAT | KhmerClassTable::CF_POS_ABOVE
+- | KhmerClassTable::CF_DOTTED_CIRCLE,
+- _cs = KhmerClassTable::CC_CONSONANT_SHIFTER | KhmerClassTable::CF_DOTTED_CIRCLE
+- | KhmerClassTable::CF_SHIFTER,
+- _dl = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BEFORE
+- | KhmerClassTable::CF_DOTTED_CIRCLE,
+- _db = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BELOW
+- | KhmerClassTable::CF_DOTTED_CIRCLE,
+- _da = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_ABOVE
+- | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_ABOVE_VOWEL,
+- _dr = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_AFTER
+- | KhmerClassTable::CF_DOTTED_CIRCLE,
+- _co = KhmerClassTable::CC_COENG | KhmerClassTable::CF_COENG
+- | KhmerClassTable::CF_DOTTED_CIRCLE,
++ _rb = KhmerClassTable::CC_ROBAT | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE,
++ _cs = KhmerClassTable::CC_CONSONANT_SHIFTER | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_SHIFTER,
++ _dl = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BEFORE | KhmerClassTable::CF_DOTTED_CIRCLE,
++ _db = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BELOW | KhmerClassTable::CF_DOTTED_CIRCLE,
++ _da = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_ABOVE_VOWEL,
++ _dr = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE,
++ _co = KhmerClassTable::CC_COENG | KhmerClassTable::CF_COENG | KhmerClassTable::CF_DOTTED_CIRCLE,
+
+ // split vowel
+ _va = _da | KhmerClassTable::CF_SPLIT_VOWEL,
+@@ -90,13 +81,10 @@
+
+
+ // Character class tables
+-
+-// _xx character does not combine into syllable, such as numbers,
+-// puntuation marks, non-Khmer signs...
++// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs...
+ // _sa Sign placed above the base
+ // _sp Sign placed after the base
+-// _c1 Consonant of type 1 or independent vowel (independent vowels
+-// behave as type 1 consonants)
++// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants)
+ // _c2 Consonant of type 2 (only RO)
+ // _c3 Consonant of type 3
+ // _rb Khmer sign robat u17CC. combining mark for subscript consonants
+@@ -105,13 +93,10 @@
+ // _db Dependent vowel placed below the base
+ // _da Dependent vowel placed above the base
+ // _dr Dependent vowel placed behind the base (right of the base)
+-// _co Khmer combining mark COENG u17D2, combines with the consonant
+-// or independent vowel following it to create a subscript consonant
+-// or independent vowel
+-// _va Khmer split vowel in wich the first part is before the base and
+-// the second one above the base
+-// _vr Khmer split vowel in wich the first part is before the base and
+-// the second one behind (right of) the base
++// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following
++// it to create a subscript consonant or independent vowel
++// _va Khmer split vowel in wich the first part is before the base and the second one above the base
++// _vr Khmer split vowel in wich the first part is before the base and the second one behind (right of) the base
+
+ static const KhmerClassTable::CharClass khmerCharClasses[] =
+ {
+@@ -129,19 +114,19 @@
+ //
+
+ //
+-// The range of characters defined in the above table is defined
+-// here. FOr Khmer 1780 to 17DF Even if the Khmer range is bigger, all
+-// other characters are not combinable, and therefore treated as _xx
++// The range of characters defined in the above table is defined here. FOr Khmer 1780 to 17DF
++// Even if the Khmer range is bigger, all other characters are not combinable, and therefore treated
++// as _xx
+ static const KhmerClassTable khmerClassTable = {0x1780, 0x17df, khmerCharClasses};
+
+
+-// Below we define how a character in the input string is either in
+-// the khmerCharClasses table (in which case we get its type back), a
+-// ZWJ or ZWNJ (two characters that may appear within the syllable,
+-// but are not in the table) we also get their type back, or an
+-// unknown object in which case we get _xx (CC_RESERVED) back
++// Below we define how a character in the input string is either in the khmerCharClasses table
++// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear
++// within the syllable, but are not in the table) we also get their type back, or an unknown object
++// in which case we get _xx (CC_RESERVED) back
+ KhmerClassTable::CharClass KhmerClassTable::getCharClass(LEUnicode ch) const
+ {
++
+ if (ch == C_SIGN_ZWJ) {
+ return CC_ZERO_WIDTH_J_MARK;
+ }
+@@ -164,13 +149,14 @@
+
+
+
+-class ReorderingOutput {
++class ReorderingOutput : public UMemory {
+ private:
+ le_int32 fOutIndex;
+ LEUnicode *fOutChars;
+
+ LEGlyphStorage &fGlyphStorage;
+
++
+ public:
+ ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage)
+ : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
+@@ -232,18 +218,11 @@
+ #define abvmFeatureMask 0x00100000UL
+ #define mkmkFeatureMask 0x00080000UL
+
+-#define tagPref (prefFeatureMask | presFeatureMask | \
+- cligFeatureMask | distFeatureMask)
+-#define tagAbvf (abvfFeatureMask | abvsFeatureMask | \
+- cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask)
+-#define tagPstf (blwfFeatureMask | blwsFeatureMask | prefFeatureMask | \
+- presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | \
+- distFeatureMask | blwmFeatureMask)
+-#define tagBlwf (blwfFeatureMask | blwsFeatureMask | cligFeatureMask | \
+- distFeatureMask | blwmFeatureMask | mkmkFeatureMask)
+-#define tagDefault (prefFeatureMask | blwfFeatureMask | presFeatureMask | \
+- blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | \
+- blwmFeatureMask | mkmkFeatureMask)
++#define tagPref (prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask)
++#define tagAbvf (abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask)
++#define tagPstf (blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask)
++#define tagBlwf (blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask)
++#define tagDefault (prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask)
+
+
+
+@@ -274,35 +253,32 @@
+ // The stateTable is used to calculate the end (the length) of a well
+ // formed Khmer Syllable.
+ //
+-// Each horizontal line is ordered exactly the same way as the values
+-// in KhmerClassTable CharClassValues in KhmerReordering.h This
+-// coincidence of values allows the follow up of the table.
++// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable
++// CharClassValues in KhmerReordering.h This coincidence of values allows the
++// follow up of the table.
+ //
+-// Each line corresponds to a state, which does not necessarily need
+-// to be a type of component... for example, state 2 is a base, with
+-// is always a first character in the syllable, but the state could be
+-// produced a consonant of any type when it is the first character
+-// that is analysed (in ground state).
++// Each line corresponds to a state, which does not necessarily need to be a type
++// of component... for example, state 2 is a base, with is always a first character
++// in the syllable, but the state could be produced a consonant of any type when
++// it is the first character that is analysed (in ground state).
+ //
+ // Differentiating 3 types of consonants is necessary in order to
+ // forbid the use of certain combinations, such as having a second
+-// coeng after a coeng RO.
+-// The inexistent possibility of having a type 3 after another type 3
+-// is permitted, eliminating it would very much complicate the table,
+-// and it does not create typing problems, as the case above.
++// coeng after a coeng RO,
++// The inexistent possibility of having a type 3 after another type 3 is permitted,
++// eliminating it would very much complicate the table, and it does not create typing
++// problems, as the case above.
+ //
+-// The table is quite complex, in order to limit the number of coeng
+-// consonants to 2 (by means of the table).
++// The table is quite complex, in order to limit the number of coeng consonants
++// to 2 (by means of the table).
+ //
+ // There a peculiarity, as far as Unicode is concerned:
+ // - The consonant-shifter is considered in two possible different
+-// locations, the one considered in Unicode 3.0 and the one considered
+-// in Unicode 4.0. (there is a backwards compatibility problem in this
+-// standard).
++// locations, the one considered in Unicode 3.0 and the one considered in
++// Unicode 4.0. (there is a backwards compatibility problem in this standard).
+
+
+-// xx independent character, such as a number, punctuation sign or
+-// non-khmer char
++// xx independent character, such as a number, punctuation sign or non-khmer char
+ //
+ // c1 Khmer consonant of type 1 or an independent vowel
+ // that is, a letter in which the subscript for is only under the
+@@ -320,10 +296,9 @@
+ //
+ // co coeng character (u17D2)
+ //
+-// dv dependent vowel (including split vowels, they are treated in the
+-// same way). even if dv is not defined above, the component that is
+-// really tested for is KhmerClassTable::CC_DEPENDENT_VOWEL, which is
+-// common to all dependent vowels
++// dv dependent vowel (including split vowels, they are treated in the same way).
++// even if dv is not defined above, the component that is really tested for is
++// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels
+ //
+ // zwj Zero Width joiner
+ //
+@@ -352,8 +327,7 @@
+ {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, // 8 - First consonant of type 2 after coeng
+ {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 9 - First consonant or type 3 after ceong
+ {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, // 10 - Second Coeng (no register shifter before)
+- {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant
+- // (or ind. vowel) no register shifter before
++ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant (or ind. vowel) no register shifter before
+ {-1, -1, 1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter
+ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 13 - Second register shifter
+ {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 14 - ZWJ before vowel
+@@ -363,6 +337,7 @@
+ {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, // 18 - ZWJ after vowel
+ {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, // 19 - Third coeng
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, // 20 - dependent vowel after a Robat
++
+ };
+
+
+@@ -377,15 +352,13 @@
+ // Given an input string of characters and a location in which to start looking
+ // calculate, using the state table, which one is the last character of the syllable
+ // that starts in the starting position.
+-le_int32 KhmerReordering::findSyllable(const KhmerClassTable *classTable,
+- const LEUnicode *chars, le_int32 prev, le_int32 charCount)
++le_int32 KhmerReordering::findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount)
+ {
+ le_int32 cursor = prev;
+ le_int8 state = 0;
+
+ while (cursor < charCount) {
+- KhmerClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor])
+- & KhmerClassTable::CF_CLASS_MASK);
++ KhmerClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & KhmerClassTable::CF_CLASS_MASK);
+
+ state = khmerStateTable[state][charClass];
+
+@@ -402,8 +375,8 @@
+
+ // This is the real reordering function as applied to the Khmer language
+
+-le_int32 KhmerReordering::reorder(const LEUnicode *chars, le_int32 charCount,
+- le_int32 /*scriptCode*/, LEUnicode *outChars, LEGlyphStorage &glyphStorage)
++le_int32 KhmerReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 /*scriptCode*/,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage)
+ {
+ const KhmerClassTable *classTable = KhmerClassTable::getKhmerClassTable();
+
+@@ -442,8 +415,7 @@
+ // and because CC_CONSONANT2 is enough to identify it, as it is the only consonant
+ // with this flag
+ if ( (charClass & KhmerClassTable::CF_COENG) && (i + 1 < syllable) &&
+- ( (classTable->getCharClass(chars[i + 1]) &
+- KhmerClassTable::CF_CLASS_MASK) == KhmerClassTable::CC_CONSONANT2) )
++ ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == KhmerClassTable::CC_CONSONANT2) )
+ {
+ coengRo = i;
+ }
+@@ -455,16 +427,15 @@
+ output.writeChar(C_RO, coengRo + 1, tagPref);
+ }
+
+- // shall we add a dotted circle? If in the position in which
+- // the base should be (first char in the string) there is a
+- // character that has the Dotted circle flag (a character that
+- // cannot be a base) then write a dotted circle
++ // shall we add a dotted circle?
++ // If in the position in which the base should be (first char in the string) there is
++ // a character that has the Dotted circle flag (a character that cannot be a base)
++ // then write a dotted circle
+ if (classTable->getCharClass(chars[prev]) & KhmerClassTable::CF_DOTTED_CIRCLE) {
+ output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault);
+ }
+
+- // copy what is left to the output, skipping before vowels and
+- // coeng Ro if they are present
++ // copy what is left to the output, skipping before vowels and coeng Ro if they are present
+ for (i = prev; i < syllable; i += 1) {
+ charClass = classTable->getCharClass(chars[i]);
+
+@@ -515,30 +486,14 @@
+ // and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two
+ // different positions, right after the shifter or after a vowel (Unicode 4)
+ if ( (charClass & KhmerClassTable::CF_SHIFTER) && (i + 1 < syllable) ) {
+- if (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_ABOVE_VOWEL ) {
+- output.writeChar(chars[i], i, tagBlwf);
+- break;
+- }
+- if (i + 2 < syllable &&
+- ( (classTable->getCharClass(chars[i + 1]) &
+- KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) &&
+- ( (classTable->getCharClass(chars[i + 2]) &
+- KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) )
+- {
+- output.writeChar(chars[i], i, tagBlwf);
+- break;
+- }
+- if (i + 3 < syllable && (classTable->getCharClass(chars[i + 3]) &
+- KhmerClassTable::CF_ABOVE_VOWEL) )
+- {
+- output.writeChar(chars[i], i, tagBlwf);
+- break;
+- }
+- if (i + 4 < syllable &&
+- ( (classTable->getCharClass(chars[i + 3]) &
+- KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) &&
+- ( (classTable->getCharClass(chars[i + 4]) &
+- KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) )
++ if ((classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_ABOVE_VOWEL)
++ || (i + 2 < syllable
++ && ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA)
++ && ( (classTable->getCharClass(chars[i + 2]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT))
++ || (i + 3 < syllable && (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_ABOVE_VOWEL))
++ || (i + 4 < syllable
++ && ( (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA)
++ && ( (classTable->getCharClass(chars[i + 4]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) ) )
+ {
+ output.writeChar(chars[i], i, tagBlwf);
+ break;
+@@ -556,3 +511,6 @@
+
+ return output.getOutputIndex();
+ }
++
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/KhmerReordering.h b/src/share/native/sun/font/layout/KhmerReordering.h
+--- jdk/src/share/native/sun/font/layout/KhmerReordering.h
++++ jdk/src/share/native/sun/font/layout/KhmerReordering.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ * This file is a modification of the ICU file IndicReordering.h
+@@ -35,80 +34,60 @@
+ #ifndef __KHMERREORDERING_H
+ #define __KHMERREORDERING_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ // Vocabulary
+-
+-// Base ->
+-// A consonant or an independent vowel in its full (not
+-// subscript) form. It is the center of the syllable, it can be
+-// souranded by coeng (subscript) consonants, vowels, split
+-// vowels, signs... but there is only one base in a syllable, it
+-// has to be coded as the first character of the syllable.
+-// split vowel ->
+-// vowel that has two parts placed separately (e.g. Before and
+-// after the consonant). Khmer language has five of them. Khmer
+-// split vowels either have one part before the base and one after
+-// the base or they have a part before the base and a part above
+-// the base. The first part of all Khmer split vowels is the same
+-// character, identical to the glyph of Khmer dependent vowel SRA
+-// EI
+-// coeng ->
+-// modifier used in Khmer to construct coeng (subscript)
+-// consonants differently than indian languages, the coeng
+-// modifies the consonant that follows it, not the one preceding
+-// it Each consonant has two forms, the base form and the
+-// subscript form the base form is the normal one (using the
+-// consonants code-point), the subscript form is displayed when
+-// the combination coeng + consonant is encountered.
+-// Consonant of type 1 ->
+-// A consonant which has subscript for that only occupies space
+-// under a base consonant
+-// Consonant of type 2 ->
+-// Its subscript form occupies space under and before the base
+-// (only one, RO)
+-// Consonant of Type 3 ->
+-// Its subscript form occupies space under and after the base
+-// (KHO, CHHO, THHO, BA, YO, SA)
+-// Consonant shifter ->
+-// Khmer has to series of consonants. The same dependent vowel has
+-// different sounds if it is attached to a consonant of the first
+-// series or a consonant of the second series Most consonants have
+-// an equivalent in the other series, but some of theme exist only
+-// in one series (for example SA). If we want to use the consonant
+-// SA with a vowel sound that can only be done with a vowel sound
+-// that corresponds to a vowel accompanying a consonant of the
+-// other series, then we need to use a consonant shifter: TRIISAP
+-// or MUSIKATOAN x17C9 y x17CA. TRIISAP changes a first series
+-// consonant to second series sound and MUSIKATOAN a second series
+-// consonant to have a first series vowel sound. Consonant
+-// shifter are both normally supercript marks, but, when they are
+-// followed by a superscript, they change shape and take the form
+-// of subscript dependent vowel SRA U. If they are in the same
+-// syllable as a coeng consonant, Unicode 3.0 says that they
+-// should be typed before the coeng. Unicode 4.0 breaks the
+-// standard and says that it should be placed after the coeng
+-// consonant.
+-// Dependent vowel ->
+-// In khmer dependent vowels can be placed above, below, before or
+-// after the base Each vowel has its own position. Only one vowel
+-// per syllable is allowed.
+-// Signs ->
+-// Khmer has above signs and post signs. Only one above sign
+-// and/or one post sign are Allowed in a syllable.
++// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the
++// center of the syllable, it can be souranded by coeng (subscript) consonants, vowels,
++// split vowels, signs... but there is only one base in a syllable, it has to be coded as
++// the first character of the syllable.
++// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant).
++// Khmer language has five of them. Khmer split vowels either have one part before the
++// base and one after the base or they have a part before the base and a part above the base.
++// The first part of all Khmer split vowels is the same character, identical to
++// the glyph of Khmer dependent vowel SRA EI
++// coeng --> modifier used in Khmer to construct coeng (subscript) consonants
++// Differently than indian languages, the coeng modifies the consonant that follows it,
++// not the one preceding it Each consonant has two forms, the base form and the subscript form
++// the base form is the normal one (using the consonants code-point), the subscript form is
++// displayed when the combination coeng + consonant is encountered.
++// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant
++// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO)
++// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA)
++// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds
++// if it is attached to a consonant of the first series or a consonant of the second series
++// Most consonants have an equivalent in the other series, but some of theme exist only in
++// one series (for example SA). If we want to use the consonant SA with a vowel sound that
++// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant
++// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN
++// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and
++// MUSIKATOAN a second series consonant to have a first series vowel sound.
++// Consonant shifter are both normally supercript marks, but, when they are followed by a
++// superscript, they change shape and take the form of subscript dependent vowel SRA U.
++// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they
++// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should
++// be placed after the coeng consonant.
++// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base
++// Each vowel has its own position. Only one vowel per syllable is allowed.
++// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are
++// Allowed in a syllable.
++//
+ //
+
+-// This list must include all types of components that can be used
+-// inside a syllable
+-struct KhmerClassTable
++struct KhmerClassTable // This list must include all types of components that can be used inside a syllable
+ {
+- // order is important here! This order must be the same that is
+- // found in each horizontal line in the statetable for Khmer (file
+- // KhmerReordering.cpp).
+- enum CharClassValues
++ enum CharClassValues // order is important here! This order must be the same that is found in each horizontal
++ // line in the statetable for Khmer (file KhmerReordering.cpp).
+ {
+ CC_RESERVED = 0,
+ CC_CONSONANT = 1, // consonant of type 1 or independent vowel
+@@ -116,8 +95,7 @@
+ CC_CONSONANT3 = 3, // Consonant of type 3
+ CC_ZERO_WIDTH_NJ_MARK = 4, // Zero Width non joiner character (0x200C)
+ CC_CONSONANT_SHIFTER = 5,
+- CC_ROBAT = 6, // Khmer special diacritic accent
+- // -treated differently in state table
++ CC_ROBAT = 6, // Khmer special diacritic accent -treated differently in state table
+ CC_COENG = 7, // Subscript consonant combining character
+ CC_DEPENDENT_VOWEL = 8,
+ CC_SIGN_ABOVE = 9,
+@@ -131,10 +109,8 @@
+ CF_CLASS_MASK = 0x0000FFFF,
+
+ CF_CONSONANT = 0x01000000, // flag to speed up comparing
+- CF_SPLIT_VOWEL = 0x02000000, // flag for a split vowel -> the first part
+- // is added in front of the syllable
+- CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with
+- // this flag is the first in a syllable
++ CF_SPLIT_VOWEL = 0x02000000, // flag for a split vowel -> the first part is added in front of the syllable
++ CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable
+ CF_COENG = 0x08000000, // flag to speed up comparing
+ CF_SHIFTER = 0x10000000, // flag to speed up comparing
+ CF_ABOVE_VOWEL = 0x20000000, // flag to speed up comparing
+@@ -161,10 +137,10 @@
+ };
+
+
+-class KhmerReordering {
++class KhmerReordering /* not : public UObject because all methods are static */ {
+ public:
+- static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount,
+- le_int32 scriptCode, LEUnicode *outChars, LEGlyphStorage &glyphStorage);
++ static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage);
+
+ static const FeatureMap *getFeatureMap(le_int32 &count);
+
+@@ -172,8 +148,10 @@
+ // do not instantiate
+ KhmerReordering();
+
+- static le_int32 findSyllable(const KhmerClassTable *classTable,
+- const LEUnicode *chars, le_int32 prev, le_int32 charCount);
++ static le_int32 findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount);
++
+ };
+
++
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LEFontInstance.cpp b/src/share/native/sun/font/layout/LEFontInstance.cpp
+--- jdk/src/share/native/sun/font/layout/LEFontInstance.cpp
++++ jdk/src/share/native/sun/font/layout/LEFontInstance.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ *******************************************************************************
+ *
+ * Copyright (C) 1999-2005, International Business Machines
+@@ -42,6 +41,10 @@
+ #include "LEFontInstance.h"
+ #include "LEGlyphStorage.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance)
++
+ const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit,
+ le_int32 script, LEErrorCode &success) const
+ {
+@@ -59,7 +62,7 @@
+ }
+
+ void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count,
+- le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const
++ le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const
+ {
+ le_int32 i, out = 0, dir = 1;
+
+@@ -100,3 +103,5 @@
+
+ return mapCharToGlyph(mappedChar);
+ }
++U_NAMESPACE_END
++
+diff --git a/src/share/native/sun/font/layout/LEFontInstance.h b/src/share/native/sun/font/layout/LEFontInstance.h
+--- jdk/src/share/native/sun/font/layout/LEFontInstance.h
++++ jdk/src/share/native/sun/font/layout/LEFontInstance.h
+@@ -34,6 +34,12 @@
+ #define __LEFONTINSTANCE_H
+
+ #include "LETypes.h"
++/**
++ * \file
++ * \brief C++ API: Layout Engine Font Instance object
++ */
++
++U_NAMESPACE_BEGIN
+
+ /**
+ * Instances of this class are used by <code>LEFontInstance::mapCharsToGlyphs</code> and
+@@ -44,7 +50,7 @@
+ *
+ * @stable ICU 3.2
+ */
+-class LECharMapper
++class LECharMapper /* not : public UObject because this is an interface/mixin class */
+ {
+ public:
+ /**
+@@ -97,7 +103,7 @@
+ *
+ * @draft ICU 3.0
+ */
+-class LEFontInstance
++class U_LAYOUT_API LEFontInstance : public UObject
+ {
+ public:
+
+@@ -160,8 +166,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset,
+- le_int32 limit, le_int32 script, LEErrorCode &success) const;
++ virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const;
+
+ //
+ // Font file access
+@@ -238,8 +243,7 @@
+ *
+ * @draft ICU 3.0
+ */
+- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count,
+- le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const;
++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const;
+
+ /**
+ * This method maps a single character to a glyph index, using the
+@@ -502,6 +506,21 @@
+ * @stable ICU 3.2
+ */
+ virtual le_int32 getLineHeight() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 3.2
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 3.2
++ */
++ static UClassID getStaticClassID();
++
+ };
+
+ inline le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const
+@@ -562,4 +581,7 @@
+ return getAscent() + getDescent() + getLeading();
+ }
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/LEGlyphFilter.h b/src/share/native/sun/font/layout/LEGlyphFilter.h
+--- jdk/src/share/native/sun/font/layout/LEGlyphFilter.h
++++ jdk/src/share/native/sun/font/layout/LEGlyphFilter.h
+@@ -34,14 +34,15 @@
+
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
+ /**
+ * This is a helper class that is used to
+ * recognize a set of glyph indices.
+ *
+ * @internal
+ */
+-class LEGlyphFilter
+-{
++class LEGlyphFilter /* not : public UObject because this is an interface/mixin class */ {
+ public:
+ /**
+ * Destructor.
+@@ -63,4 +64,5 @@
+ virtual le_bool accept(LEGlyphID glyph) const = 0;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.cpp b/src/share/native/sun/font/layout/LEGlyphStorage.cpp
+--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp
++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ **********************************************************************
+ * Copyright (C) 1998-2005, International Business Machines
+ * Corporation and others. All Rights Reserved.
+@@ -35,6 +34,10 @@
+ #include "LEInsertionList.h"
+ #include "LEGlyphStorage.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage)
++
+ LEGlyphStorage::LEGlyphStorage()
+ : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL),
+ fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0)
+@@ -603,3 +606,6 @@
+
+ return FALSE;
+ }
++
++U_NAMESPACE_END
++
+diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.h b/src/share/native/sun/font/layout/LEGlyphStorage.h
+--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.h
++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ **********************************************************************
+ * Copyright (C) 1998-2005, International Business Machines
+ * Corporation and others. All Rights Reserved.
+@@ -38,6 +37,13 @@
+ #include "LEInsertionList.h"
+
+ /**
++ * \file
++ * \brief C++ API: This class encapsulates the per-glyph storage used by the ICU LayoutEngine.
++ */
++
++U_NAMESPACE_BEGIN
++
++/**
+ * This class encapsulates the per-glyph storage used by the ICU LayoutEngine.
+ * For each glyph it holds the glyph ID, the index of the backing store character
+ * which produced the glyph, the X and Y position of the glyph and an auxillary data
+@@ -50,7 +56,7 @@
+ *
+ * @draft ICU 3.6
+ */
+-class U_LAYOUT_API LEGlyphStorage : protected LEInsertionCallback
++class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback
+ {
+ private:
+ /**
+@@ -112,35 +118,37 @@
+
+ protected:
+ /**
+- * This implements <code>LEInsertionCallback</code>. The
+- * <code>LEInsertionList</code> will call this method once for
+- * each insertion.
++ * This implements <code>LEInsertionCallback</code>. The <code>LEInsertionList</code>
++ * will call this method once for each insertion.
+ *
+ * @param atPosition the position of the insertion
+ * @param count the number of glyphs being inserted
+ * @param newGlyphs the address of the new glyph IDs
+ *
+- * @return <code>true</code> if <code>LEInsertionList</code>
+- * should stop processing the insertion list after this insertion.
++ * @return <code>true</code> if <code>LEInsertionList</code> should stop
++ * processing the insertion list after this insertion.
+ *
+ * @see LEInsertionList.h
+ *
+ * @draft ICU 3.0
+ */
+- virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count,
+- LEGlyphID newGlyphs[]);
++ virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]);
+
+ public:
+
+ /**
+- * Allocates an empty <code>LEGlyphStorage</code> object. You must
+- * call <code>allocateGlyphArray, allocatePositions and
+- * allocateAuxData</code> to allocate the data.
++ * Allocates an empty <code>LEGlyphStorage</code> object. You must call
++ * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code>
++ * to allocate the data.
++ *
++ * @draft ICU 3.0
+ */
+ LEGlyphStorage();
+
+ /**
+ * The destructor. This will deallocate all of the arrays.
++ *
++ * @draft ICU 3.0
+ */
+ ~LEGlyphStorage();
+
+@@ -154,9 +162,9 @@
+ inline le_int32 getGlyphCount() const;
+
+ /**
+- * This method copies the glyph array into a caller supplied
+- * array. The caller must ensure that the array is large enough
+- * to hold all the glyphs.
++ * This method copies the glyph array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold all
++ * the glyphs.
+ *
+ * @param glyphs - the destiniation glyph array
+ * @param success - set to an error code if the operation fails
+@@ -166,10 +174,10 @@
+ void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const;
+
+ /**
+- * This method copies the glyph array into a caller supplied
+- * array, ORing in extra bits. (This functionality is needed by
+- * the JDK, which uses 32 bits pre glyph idex, with the high 16
+- * bits encoding the composite font slot number)
++ * This method copies the glyph array into a caller supplied array,
++ * ORing in extra bits. (This functionality is needed by the JDK,
++ * which uses 32 bits pre glyph idex, with the high 16 bits encoding
++ * the composite font slot number)
+ *
+ * @param glyphs - the destination (32 bit) glyph array
+ * @param extraBits - this value will be ORed with each glyph index
+@@ -177,13 +185,12 @@
+ *
+ * @draft ICU 3.0
+ */
+- void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits,
+- LEErrorCode &success) const;
++ void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const;
+
+ /**
+- * This method copies the character index array into a caller
+- * supplied array. The caller must ensure that the array is large
+- * enough to hold a character index for each glyph.
++ * This method copies the character index array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold a
++ * character index for each glyph.
+ *
+ * @param charIndices - the destiniation character index array
+ * @param success - set to an error code if the operation fails
+@@ -193,9 +200,9 @@
+ void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const;
+
+ /**
+- * This method copies the character index array into a caller
+- * supplied array. The caller must ensure that the array is large
+- * enough to hold a character index for each glyph.
++ * This method copies the character index array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold a
++ * character index for each glyph.
+ *
+ * @param charIndices - the destiniation character index array
+ * @param indexBase - an offset which will be added to each index
+@@ -203,14 +210,13 @@
+ *
+ * @draft ICU 3.0
+ */
+- void getCharIndices(le_int32 charIndices[], le_int32 indexBase,
+- LEErrorCode &success) const;
++ void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const;
+
+ /**
+- * This method copies the position array into a caller supplied
+- * array. The caller must ensure that the array is large enough
+- * to hold an X and Y position for each glyph, plus an extra X and
+- * Y for the advance of the last glyph.
++ * This method copies the position array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold an
++ * X and Y position for each glyph, plus an extra X and Y for the
++ * advance of the last glyph.
+ *
+ * @param positions - the destiniation position array
+ * @param success - set to an error code if the operation fails
+@@ -233,33 +239,27 @@
+ *
+ * @draft ICU 3.0
+ */
+- void getGlyphPosition(le_int32 glyphIndex, float &x, float &y,
+- LEErrorCode &success) const;
++ void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const;
+
+ /**
+- * This method allocates the glyph array, the char indices array
+- * and the insertion list. You must call this method before using
+- * the object. This method also initializes the char indices
++ * This method allocates the glyph array, the char indices array and the insertion list. You
++ * must call this method before using the object. This method also initializes the char indices
+ * array.
+- * @param initialGlyphCount the initial size of the glyph and char
+- * indices arrays.
+- * @param rightToLeft <code>true</code> if the original input text
+- * is right to left.
+- * @param success set to an error code if the storage cannot be
+- * allocated of if the initial glyph count is not positive.
++ *
++ * @param initialGlyphCount the initial size of the glyph and char indices arrays.
++ * @param rightToLeft <code>true</code> if the original input text is right to left.
++ * @param success set to an error code if the storage cannot be allocated of if the initial
++ * glyph count is not positive.
+ *
+ * @draft ICU 3.0
+ */
+- void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft,
+- LEErrorCode &success);
++ void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success);
+
+ /**
+- * This method allocates the storage for the glyph positions. It
+- * allocates one extra X, Y position pair for the position just
+- * after the last glyph.
++ * This method allocates the storage for the glyph positions. It allocates one extra X, Y
++ * position pair for the position just after the last glyph.
+ *
+- * @param success set to an error code if the positions array
+- * cannot be allocated.
++ * @param success set to an error code if the positions array cannot be allocated.
+ *
+ * @return the number of X, Y position pairs allocated.
+ *
+@@ -270,8 +270,7 @@
+ /**
+ * This method allocates the storage for the auxillary glyph data.
+ *
+- * @param success set to an error code if the aulillary data array
+- * cannot be allocated.
++ * @param success set to an error code if the aulillary data array cannot be allocated.
+ *
+ * @return the size of the auxillary data array.
+ *
+@@ -282,10 +281,8 @@
+ /**
+ * Copy the entire auxillary data array.
+ *
+- * @param auxData the auxillary data array will be copied to this
+- * address
+- * @param success set to an error code if the data cannot be
+- * copied
++ * @param auxData the auxillary data array will be copied to this address
++ * @param success set to an error code if the data cannot be copied
+ *
+ * @draft ICU 3.6
+ */
+@@ -295,8 +292,7 @@
+ * Get the glyph ID for a particular glyph.
+ *
+ * @param glyphIndex the index into the glyph array
+- * @param success set to an error code if the glyph ID cannot be
+- * retrieved.
++ * @param success set to an error code if the glyph ID cannot be retrieved.
+ *
+ * @return the glyph ID
+ *
+@@ -308,8 +304,7 @@
+ * Get the char index for a particular glyph.
+ *
+ * @param glyphIndex the index into the glyph array
+- * @param success set to an error code if the char index cannot be
+- * retrieved.
++ * @param success set to an error code if the char index cannot be retrieved.
+ *
+ * @return the character index
+ *
+@@ -322,8 +317,7 @@
+ * Get the auxillary data for a particular glyph.
+ *
+ * @param glyphIndex the index into the glyph array
+- * @param success set to an error code if the auxillary data
+- * cannot be retrieved.
++ * @param success set to an error code if the auxillary data cannot be retrieved.
+ *
+ * @return the auxillary data
+ *
+@@ -345,11 +339,10 @@
+
+ /**
+ * Call this method to replace a single glyph in the glyph array
+- * with multiple glyphs. This method uses the
+- * <code>LEInsertionList</code> to do the insertion. It returns
+- * the address of storage where the new glyph IDs can be
+- * stored. They will not actually be inserted into the glyph array
+- * until <code>applyInsertions</code> is called.
++ * with multiple glyphs. This method uses the <code>LEInsertionList</code>
++ * to do the insertion. It returns the address of storage where the new
++ * glyph IDs can be stored. They will not actually be inserted into the
++ * glyph array until <code>applyInsertions</code> is called.
+ *
+ * @param atIndex the index of the glyph to be replaced
+ * @param insertCount the number of glyphs to replace it with
+@@ -381,26 +374,22 @@
+ *
+ * @param glyphIndex the index of the glyph
+ * @param glyphID the new glyph ID
+- * @param success will be set to an error code if the glyph ID
+- * cannot be set.
++ * @param success will be set to an error code if the glyph ID cannot be set.
+ *
+ * @draft ICU 3.0
+ */
+- void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID,
+- LEErrorCode &success);
++ void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success);
+
+ /**
+ * Set the char index for a particular glyph.
+ *
+ * @param glyphIndex the index of the glyph
+ * @param charIndex the new char index
+- * @param success will be set to an error code if the char index
+- * cannot be set.
++ * @param success will be set to an error code if the char index cannot be set.
+ *
+ * @draft ICU 3.0
+ */
+- void setCharIndex(le_int32 glyphIndex, le_int32 charIndex,
+- LEErrorCode &success);
++ void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success);
+
+ /**
+ * Set the X, Y position for a particular glyph.
+@@ -408,13 +397,11 @@
+ * @param glyphIndex the index of the glyph
+ * @param x the new X position
+ * @param y the new Y position
+- * @param success will be set to an error code if the position
+- * cannot be set.
++ * @param success will be set to an error code if the position cannot be set.
+ *
+ * @draft ICU 3.0
+ */
+- void setPosition(le_int32 glyphIndex, float x, float y,
+- LEErrorCode &success);
++ void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success);
+
+ /**
+ * Adjust the X, Y position for a particular glyph.
+@@ -422,21 +409,18 @@
+ * @param glyphIndex the index of the glyph
+ * @param xAdjust the adjustment to the glyph's X position
+ * @param yAdjust the adjustment to the glyph's Y position
+- * @param success will be set to an error code if the glyph's
+- * position cannot be adjusted.
++ * @param success will be set to an error code if the glyph's position cannot be adjusted.
+ *
+ * @draft ICU 3.0
+ */
+- void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust,
+- LEErrorCode &success);
++ void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success);
+
+ /**
+ * Set the auxillary data for a particular glyph.
+ *
+ * @param glyphIndex the index of the glyph
+ * @param auxData the new auxillary data
+- * @param success will be set to an error code if the auxillary
+- * data cannot be set.
++ * @param success will be set to an error code if the auxillary data cannot be set.
+ *
+ * @draft ICU 3.6
+ */
+@@ -511,14 +495,28 @@
+ void adoptGlyphCount(le_int32 newGlyphCount);
+
+ /**
+- * This method frees the glyph, character index, position and
+- * auxillary data arrays so that the LayoutEngine can be reused to
+- * layout a different characer array. (This method is also called
++ * This method frees the glyph, character index, position and
++ * auxillary data arrays so that the LayoutEngine can be reused
++ * to layout a different characer array. (This method is also called
+ * by the destructor)
+ *
+ * @draft ICU 3.0
+ */
+ void reset();
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @draft ICU 3.0
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @draft ICU 3.0
++ */
++ static UClassID getStaticClassID();
+ };
+
+ inline le_int32 LEGlyphStorage::getGlyphCount() const
+@@ -531,4 +529,7 @@
+ return fGlyphs[glyphIndex];
+ }
+
++
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/LEInsertionList.cpp b/src/share/native/sun/font/layout/LEInsertionList.cpp
+--- jdk/src/share/native/sun/font/layout/LEInsertionList.cpp
++++ jdk/src/share/native/sun/font/layout/LEInsertionList.cpp
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ **********************************************************************
+ * Copyright (C) 1998-2004, International Business Machines
+ * Corporation and others. All Rights Reserved.
+@@ -34,6 +33,8 @@
+ #include "LETypes.h"
+ #include "LEInsertionList.h"
+
++U_NAMESPACE_BEGIN
++
+ #define ANY_NUMBER 1
+
+ struct InsertionRecord
+@@ -44,6 +45,8 @@
+ LEGlyphID glyphs[ANY_NUMBER];
+ };
+
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEInsertionList)
++
+ LEInsertionList::LEInsertionList(le_bool rightToLeft)
+ : head(NULL), tail(NULL), growAmount(0), append(rightToLeft)
+ {
+@@ -106,3 +109,5 @@
+
+ return FALSE;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LEInsertionList.h b/src/share/native/sun/font/layout/LEInsertionList.h
+--- jdk/src/share/native/sun/font/layout/LEInsertionList.h
++++ jdk/src/share/native/sun/font/layout/LEInsertionList.h
+@@ -24,7 +24,6 @@
+ */
+
+ /*
+- *
+ **********************************************************************
+ * Copyright (C) 1998-2004, International Business Machines
+ * Corporation and others. All Rights Reserved.
+@@ -36,6 +35,8 @@
+
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
+ struct InsertionRecord;
+
+ /**
+@@ -78,7 +79,7 @@
+ *
+ * @internal
+ */
+-class LEInsertionList
++class LEInsertionList : public UObject
+ {
+ public:
+ /**
+@@ -140,6 +141,20 @@
+ */
+ void reset();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+
+ /**
+@@ -174,4 +189,6 @@
+ le_bool append;
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/LELanguages.h b/src/share/native/sun/font/layout/LELanguages.h
+--- jdk/src/share/native/sun/font/layout/LELanguages.h
++++ jdk/src/share/native/sun/font/layout/LELanguages.h
+@@ -25,10 +25,12 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
++ *
++ * Generated on: 07/19/2005 01:01:08 PM PDT
+ */
+
+ #ifndef __LELANGUAGES_H
+@@ -37,11 +39,18 @@
+ #include "LETypes.h"
+
+ /**
++ * \file
++ * \brief C++ API: List of language codes for LayoutEngine
++ */
++
++U_NAMESPACE_BEGIN
++
++/**
+ * A provisional list of language codes. For now,
+ * this is just a list of languages which the LayoutEngine
+ * supports.
+ *
+- * @draft ICU 3.0
++ * @draft ICU 3.4
+ */
+
+ enum LanguageCodes {
+@@ -79,4 +88,5 @@
+ languageCodeCount = 30
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LEScripts.h b/src/share/native/sun/font/layout/LEScripts.h
+--- jdk/src/share/native/sun/font/layout/LEScripts.h
++++ jdk/src/share/native/sun/font/layout/LEScripts.h
+@@ -25,17 +25,23 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
+- *
+ */
+
+ #ifndef __LESCRIPTS_H
+ #define __LESCRIPTS_H
+
+ #include "LETypes.h"
++/**
++ * \file
++ * \brief C++ API: Constants for Unicode script values
++ */
++
++
++U_NAMESPACE_BEGIN
+
+ /**
+ * Constants for Unicode script values, generated using
+@@ -104,4 +110,5 @@
+ scriptCodeCount = 55
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LEStandalone.h b/src/share/native/sun/font/layout/LEStandalone.h
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/LEStandalone.h
+@@ -0,0 +1,132 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Sun designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Sun in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ *
++ */
++
++#ifndef __LESTANDALONE
++#define __LESTANDALONE
++
++/* Definitions to make Layout Engine work away from ICU. */
++#ifndef U_NAMESPACE_BEGIN
++#define U_NAMESPACE_BEGIN
++#endif
++
++#ifndef U_NAMESPACE_END
++#define U_NAMESPACE_END
++#endif
++
++/* RTTI Definition */
++typedef const char *UClassID;
++#ifndef UOBJECT_DEFINE_RTTI_IMPLEMENTATION
++#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(x) UClassID x::getStaticClassID(){static char z=0; return (UClassID)&z; } UClassID x::getDynamicClassID() const{return x::getStaticClassID(); }
++#endif
++
++/* UMemory's functions aren't used by the layout engine. */
++struct UMemory {};
++/* UObject's functions aren't used by the layout engine. */
++struct UObject {};
++
++/* String handling */
++#include <stdlib.h>
++#include <string.h>
++
++/**
++ * A convenience macro to test for the success of a LayoutEngine call.
++ *
++ * @stable ICU 2.4
++ */
++#define LE_SUCCESS(code) ((code)<=LE_NO_ERROR)
++
++/**
++ * A convenience macro to test for the failure of a LayoutEngine call.
++ *
++ * @stable ICU 2.4
++ */
++#define LE_FAILURE(code) ((code)>LE_NO_ERROR)
++
++
++#ifndef _LP64
++typedef long le_int32;
++typedef unsigned long le_uint32;
++#else
++typedef int le_int32;
++typedef unsigned int le_uint32;
++#endif
++
++#define HAVE_LE_INT32 1
++#define HAVE_LE_UINT32 1
++
++typedef unsigned short UChar;
++typedef le_uint32 UChar32;
++
++typedef short le_int16;
++#define HAVE_LE_INT16 1
++
++typedef unsigned short le_uint16;
++#define HAVE_LE_UINT16
++
++typedef signed char le_int8;
++#define HAVE_LE_INT8
++
++typedef unsigned char le_uint8;
++#define HAVE_LE_UINT8
++
++typedef char UBool;
++
++/**
++ * Error codes returned by the LayoutEngine.
++ *
++ * @stable ICU 2.4
++ */
++enum LEErrorCode {
++ /* informational */
++ LE_NO_SUBFONT_WARNING = -127, // U_USING_DEFAULT_WARNING,
++
++ /* success */
++ LE_NO_ERROR = 0, // U_ZERO_ERROR,
++
++ /* failures */
++ LE_ILLEGAL_ARGUMENT_ERROR = 1, // U_ILLEGAL_ARGUMENT_ERROR,
++ LE_MEMORY_ALLOCATION_ERROR = 7, // U_MEMORY_ALLOCATION_ERROR,
++ LE_INDEX_OUT_OF_BOUNDS_ERROR = 8, //U_INDEX_OUTOFBOUNDS_ERROR,
++ LE_NO_LAYOUT_ERROR = 16, // U_UNSUPPORTED_ERROR,
++ LE_INTERNAL_ERROR = 5, // U_INTERNAL_PROGRAM_ERROR,
++ LE_FONT_FILE_NOT_FOUND_ERROR = 4, // U_FILE_ACCESS_ERROR,
++ LE_MISSING_FONT_TABLE_ERROR = 2 // U_MISSING_RESOURCE_ERROR
++};
++#define HAVE_LEERRORCODE
++
++#define U_LAYOUT_API
++
++#define uprv_malloc malloc
++#define uprv_free free
++#define uprv_memcpy memcpy
++#define uprv_realloc realloc
++
++#if !defined(U_IS_BIG_ENDIAN)
++ #ifdef _LITTLE_ENDIAN
++ #define U_IS_BIG_ENDIAN 0
++ #endif
++#endif
++
++#endif
+diff --git a/src/share/native/sun/font/layout/LESwaps.h b/src/share/native/sun/font/layout/LESwaps.h
+--- jdk/src/share/native/sun/font/layout/LESwaps.h
++++ jdk/src/share/native/sun/font/layout/LESwaps.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+
+@@ -35,11 +35,12 @@
+
+ #include "LETypes.h"
+
+-#if !defined(U_IS_BIG_ENDIAN)
+- #ifdef _LITTLE_ENDIAN
+- #define U_IS_BIG_ENDIAN 0
+- #endif
+-#endif
++/**
++ * \file
++ * \brief C++ API: Endian independent access to data for LayoutEngine
++ */
++
++U_NAMESPACE_BEGIN
+
+ /**
+ * A convenience macro which invokes the swapWord member function
+@@ -47,7 +48,6 @@
+ *
+ * @stable ICU 2.8
+ */
+-
+ #if defined(U_IS_BIG_ENDIAN)
+ #if U_IS_BIG_ENDIAN
+ #define SWAPW(value) (value)
+@@ -64,7 +64,6 @@
+ *
+ * @stable ICU 2.8
+ */
+-
+ #if defined(U_IS_BIG_ENDIAN)
+ #if U_IS_BIG_ENDIAN
+ #define SWAPL(value) (value)
+@@ -86,8 +85,7 @@
+ *
+ * @stable ICU 2.8
+ */
+-class LESwaps
+-{
++class U_LAYOUT_API LESwaps /* not : public UObject because all methods are static */ {
+ public:
+
+ #if !defined(U_IS_BIG_ENDIAN)
+@@ -144,4 +142,5 @@
+ LESwaps() {} // private - forbid instantiation
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h
+--- jdk/src/share/native/sun/font/layout/LETypes.h
++++ jdk/src/share/native/sun/font/layout/LETypes.h
+@@ -23,7 +23,6 @@
+ *
+ */
+
+-
+ /*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+@@ -33,73 +32,97 @@
+ #ifndef __LETYPES_H
+ #define __LETYPES_H
+
++/**
++ * If LE_Standalone is defined, it must exist and contain
++ * definitions for some core ICU defines.
++ */
++#ifdef LE_STANDALONE
++#include "LEStandalone.h"
++#endif
++
++#ifdef LE_STANDALONE
++/* Stand-alone Layout Engine- without ICU. */
++#include "LEStandalone.h"
+ #define LE_USE_CMEMORY
++#else
++#if !defined(LE_USE_CMEMORY) && (defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_STATIC_IMPLEMENTATION) || defined(U_COMBINED_IMPLEMENTATION))
++#define LE_USE_CMEMORY
++#endif
+
++#include "unicode/utypes.h"
++#include "unicode/uobject.h"
+ #ifdef LE_USE_CMEMORY
+ #include "cmemory.h"
+ #endif
++#endif /* not standalone */
+
+-#ifndef _LP64
+-typedef long le_int32;
+-typedef unsigned long le_uint32;
+-#else
+-typedef int le_int32;
+-typedef unsigned int le_uint32;
+-#endif
++U_NAMESPACE_BEGIN
+
+-typedef short le_int16;
+-typedef unsigned short le_uint16;
+-typedef signed char le_int8;
+-typedef unsigned char le_uint8;
+-typedef char le_bool;
++/*!
++ * \file
++ * \brief Basic definitions for the ICU LayoutEngine
++ */
+
+-typedef char UClassID;
+-
+-#if 0
+ /**
+ * A type used for signed, 32-bit integers.
+ *
+ * @stable ICU 2.4
+ */
++#ifndef HAVE_LE_INT32
+ typedef int32_t le_int32;
++#endif
+
+ /**
+ * A type used for unsigned, 32-bit integers.
+ *
+ * @stable ICU 2.4
+ */
++#ifndef HAVE_LE_UINT32
+ typedef uint32_t le_uint32;
++#endif
+
+ /**
+ * A type used for signed, 16-bit integers.
+ *
+ * @stable ICU 2.4
+ */
++#ifndef HAVE_LE_INT16
+ typedef int16_t le_int16;
++#endif
+
++#ifndef HAVE_LE_UINT16
+ /**
+ * A type used for unsigned, 16-bit integers.
+ *
+ * @stable ICU 2.4
+ */
+ typedef uint16_t le_uint16;
++#endif
+
++#ifndef HAVE_LE_INT8
+ /**
+ * A type used for signed, 8-bit integers.
+ *
+ * @stable ICU 2.4
+ */
+ typedef int8_t le_int8;
+-
++#endif
++
++#ifndef HAVE_LE_UINT8
+ /**
+ * A type used for unsigned, 8-bit integers.
+ *
+ * @stable ICU 2.4
+ */
+ typedef uint8_t le_uint8;
++#endif
+
+-typedef char le_bool;
+-#endif
++/**
++* A type used for boolean values.
++*
++* @stable ICU 2.4
++*/
++typedef UBool le_bool;
+
+ #ifndef TRUE
+ /**
+@@ -292,21 +315,21 @@
+ *
+ * @stable ICU 2.4
+ */
+-typedef le_uint16 LEUnicode16;
++typedef UChar LEUnicode16;
+
+ /**
+ * Used to represent 32-bit Unicode code points.
+ *
+ * @stable ICU 2.4
+ */
+-typedef le_uint32 LEUnicode32;
++typedef UChar32 LEUnicode32;
+
+ /**
+ * Used to represent 16-bit Unicode code points.
+ *
+ * @deprecated since ICU 2.4. Use LEUnicode16 instead
+ */
+-typedef le_uint16 LEUnicode;
++typedef UChar LEUnicode;
+
+ /**
+ * Used to hold a pair of (x, y) values which represent a point.
+@@ -353,7 +376,7 @@
+ *
+ * @internal
+ */
+-#define LE_ARRAY_COPY(dst, src, count) memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0])
++#define LE_ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0])
+
+ /**
+ * Allocate an array of basic types. This is used to isolate the rest of
+@@ -361,7 +384,7 @@
+ *
+ * @internal
+ */
+-#define LE_NEW_ARRAY(type, count) (type *) malloc((count) * sizeof(type))
++#define LE_NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type))
+
+ /**
+ * Re-allocate an array of basic types. This is used to isolate the rest of
+@@ -369,7 +392,7 @@
+ *
+ * @internal
+ */
+-#define LE_GROW_ARRAY(array, newSize) realloc((void *) (array), (newSize) * sizeof (array)[0])
++#define LE_GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0])
+
+ /**
+ * Free an array of basic types. This is used to isolate the rest of
+@@ -377,7 +400,7 @@
+ *
+ * @internal
+ */
+-#define LE_DELETE_ARRAY(array) free((void *) (array))
++#define LE_DELETE_ARRAY(array) uprv_free((void *) (array))
+ #endif
+
+ /**
+@@ -595,22 +618,24 @@
+ *
+ * @stable ICU 2.4
+ */
++#ifndef HAVE_LEERRORCODE
+ enum LEErrorCode {
+ /* informational */
+- LE_NO_SUBFONT_WARNING = -127, // U_USING_DEFAULT_WARNING,
++ LE_NO_SUBFONT_WARNING = U_USING_DEFAULT_WARNING, /**< The font does not contain subfonts. */
+
+ /* success */
+- LE_NO_ERROR = 0, // U_ZERO_ERROR,
++ LE_NO_ERROR = U_ZERO_ERROR, /**< No error, no warning. */
+
+ /* failures */
+- LE_ILLEGAL_ARGUMENT_ERROR = 1, // U_ILLEGAL_ARGUMENT_ERROR,
+- LE_MEMORY_ALLOCATION_ERROR = 7, // U_MEMORY_ALLOCATION_ERROR,
+- LE_INDEX_OUT_OF_BOUNDS_ERROR = 8, //U_INDEX_OUTOFBOUNDS_ERROR,
+- LE_NO_LAYOUT_ERROR = 16, // U_UNSUPPORTED_ERROR,
+- LE_INTERNAL_ERROR = 5, // U_INTERNAL_PROGRAM_ERROR,
+- LE_FONT_FILE_NOT_FOUND_ERROR = 4, // U_FILE_ACCESS_ERROR,
+- LE_MISSING_FONT_TABLE_ERROR = 2 // U_MISSING_RESOURCE_ERROR
++ LE_ILLEGAL_ARGUMENT_ERROR = U_ILLEGAL_ARGUMENT_ERROR, /**< An illegal argument was detected. */
++ LE_MEMORY_ALLOCATION_ERROR = U_MEMORY_ALLOCATION_ERROR, /**< Memory allocation error. */
++ LE_INDEX_OUT_OF_BOUNDS_ERROR = U_INDEX_OUTOFBOUNDS_ERROR, /**< Trying to access an index that is out of bounds. */
++ LE_NO_LAYOUT_ERROR = U_UNSUPPORTED_ERROR, /**< You must call layoutChars() first. */
++ LE_INTERNAL_ERROR = U_INTERNAL_PROGRAM_ERROR, /**< An internal error was encountered. */
++ LE_FONT_FILE_NOT_FOUND_ERROR = U_FILE_ACCESS_ERROR, /**< The requested font file cannot be opened. */
++ LE_MISSING_FONT_TABLE_ERROR = U_MISSING_RESOURCE_ERROR /**< The requested font table does not exist. */
+ };
++#endif
+
+ #ifndef XP_CPLUSPLUS
+ /**
+@@ -626,7 +651,9 @@
+ *
+ * @stable ICU 2.4
+ */
+-#define LE_SUCCESS(code) ((code)<=LE_NO_ERROR)
++#ifndef LE_FAILURE
++#define LE_SUCCESS(code) (U_SUCCESS((UErrorCode)code))
++#endif
+
+ enum LEFeatureENUMs {
+ LE_Kerning_FEATURE_ENUM = 0,
+@@ -648,7 +675,11 @@
+ *
+ * @stable ICU 2.4
+ */
+-#define LE_FAILURE(code) ((code)>LE_NO_ERROR)
++#ifndef LE_FAILURE
++#define LE_FAILURE(code) (U_FAILURE((UErrorCode)code))
++#endif
+
+-#define U_LAYOUT_API
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
+@@ -23,6 +23,7 @@
+ *
+ */
+
++
+ /*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+@@ -41,6 +42,7 @@
+ #include "IndicLayoutEngine.h"
+ #include "KhmerLayoutEngine.h"
+ #include "ThaiLayoutEngine.h"
++//#include "TibetanLayoutEngine.h"
+ #include "GXLayoutEngine.h"
+ #include "ScriptAndLanguageTags.h"
+ #include "CharSubstitutionFilter.h"
+@@ -56,6 +58,8 @@
+
+ #include "KernTable.h"
+
++U_NAMESPACE_BEGIN
++
+ const LEUnicode32 DefaultCharMapper::controlChars[] = {
+ 0x0009, 0x000A, 0x000D,
+ /*0x200C, 0x200D,*/ 0x200E, 0x200F,
+@@ -102,9 +106,7 @@
+ }
+
+ if (fMirror) {
+- le_int32 index = OpenTypeUtilities::search((le_uint32) ch,
+- (le_uint32 *)DefaultCharMapper::mirroredChars,
+- DefaultCharMapper::mirroredCharsCount);
++ le_int32 index = OpenTypeUtilities::search((le_uint32) ch, (le_uint32 *)DefaultCharMapper::mirroredChars, DefaultCharMapper::mirroredCharsCount);
+
+ if (mirroredChars[index] == ch) {
+ return DefaultCharMapper::srahCderorrim[index];
+@@ -133,6 +135,9 @@
+ // nothing to do
+ }
+
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine)
++
+ #define ccmpFeatureTag LE_CCMP_FEATURE_TAG
+
+ #define ccmpFeatureMask 0x80000000UL
+@@ -146,10 +151,9 @@
+
+ static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap);
+
+-LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, le_int32 typoFlags)
+- : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode),
+- fLanguageCode(languageCode), fTypoFlags(typoFlags)
++LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
++ : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode),
++ fTypoFlags(typoFlags)
+ {
+ fGlyphStorage = new LEGlyphStorage();
+ }
+@@ -159,8 +163,7 @@
+ return fGlyphStorage->getGlyphCount();
+ }
+
+-void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase,
+- LEErrorCode &success) const
++void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const
+ {
+ fGlyphStorage->getCharIndices(charIndices, indexBase, success);
+ }
+@@ -171,8 +174,7 @@
+ }
+
+ // Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits
+-void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits,
+- LEErrorCode &success) const
++void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const
+ {
+ fGlyphStorage->getGlyphs(glyphs, extraBits, success);
+ }
+@@ -219,15 +221,13 @@
+ fGlyphStorage->getGlyphPositions(positions, success);
+ }
+
+-void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y,
+- LEErrorCode &success) const
++void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const
+ {
+ fGlyphStorage->getGlyphPosition(glyphIndex, x, y, success);
+ }
+
+-le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft, LEUnicode *&outChars,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -238,12 +238,7 @@
+ return 0;
+ }
+
+- if ((fTypoFlags & 0x4) == 0) { // no canonical processing
+- return count;
+- }
+-
+- const GlyphSubstitutionTableHeader *canonGSUBTable =
+- (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
++ const GlyphSubstitutionTableHeader *canonGSUBTable = (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
+ LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode);
+ LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode);
+ le_int32 i, dir = 1, out = 0, outCharCount = count;
+@@ -257,16 +252,15 @@
+ // We could just do the mark reordering for all scripts, but most
+ // of them probably don't need it...
+ if (fScriptCode == hebrScriptCode) {
+- reordered = LE_NEW_ARRAY(LEUnicode, count);
++ reordered = LE_NEW_ARRAY(LEUnicode, count);
+
+- if (reordered == NULL) {
+- success = LE_MEMORY_ALLOCATION_ERROR;
+- return 0;
+- }
++ if (reordered == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
+
+- CanonShaping::reorderMarks(&chars[offset], count, rightToLeft,
+- reordered, glyphStorage);
+- inChars = reordered;
++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, glyphStorage);
++ inChars = reordered;
+ }
+
+ glyphStorage.allocateGlyphArray(count, rightToLeft, success);
+@@ -290,8 +284,7 @@
+ LE_DELETE_ARRAY(reordered);
+ }
+
+- outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag,
+- langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE);
++ outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE);
+
+ out = (rightToLeft? outCharCount - 1 : 0);
+
+@@ -306,35 +299,26 @@
+ return outCharCount;
+ }
+
+-
+-le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+
+- if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max ||
+- offset + count > max) {
+-
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+ success = LE_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ LEUnicode *outChars = NULL;
+- le_int32 outCharCount = characterProcessing(chars, offset, count, max,
+- rightToLeft, outChars, glyphStorage, success);
++ le_int32 outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success);
+
+ if (outChars != NULL) {
+- mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft,
+- glyphStorage, success);
+- // FIXME: a subclass may have allocated this, in which case this delete
+- // might not work...
+- LE_DELETE_ARRAY(outChars);
++ mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft, glyphStorage, success);
++ LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work...
+ } else {
+- mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft,
+- glyphStorage, success);
++ mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success);
+ }
+
+ return glyphStorage.getGlyphCount();
+@@ -342,8 +326,7 @@
+
+ // Input: glyphs
+ // Output: positions
+-void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage,
+- float x, float y, LEErrorCode &success)
++void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -370,9 +353,8 @@
+ glyphStorage.setPosition(glyphCount, x, y, success);
+ }
+
+-void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -399,8 +381,7 @@
+ return;
+ }
+
+-void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage,
+- LEGlyphFilter *markFilter, LEErrorCode &success)
++void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success)
+ {
+ float xAdjust = 0;
+ le_int32 p, glyphCount = glyphStorage.getGlyphCount();
+@@ -436,9 +417,7 @@
+ glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success);
+ }
+
+-void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount,
+- le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter,
+- LEErrorCode &success)
++void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success)
+ {
+ float xAdjust = 0;
+ le_int32 c = 0, direction = 1, p;
+@@ -485,9 +464,8 @@
+ return fFontInstance->getFontTable(tableTag);
+ }
+
+-void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, le_bool mirror,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -497,32 +475,27 @@
+
+ DefaultCharMapper charMapper(TRUE, mirror);
+
+- fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse,
+- &charMapper, glyphStorage);
++ fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, glyphStorage);
+ }
+
+ // Input: characters, font?
+ // Output: glyphs, positions, char indices
+ // Returns: number of glyphs
+-le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- float x, float y, LEErrorCode &success)
++le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ float x, float y, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+
+- if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max ||
+- offset + count > max) {
+-
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+ success = LE_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ le_int32 glyphCount;
+
+- glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft,
+- *fGlyphStorage, success);
++ glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success);
+ positionGlyphs(*fGlyphStorage, x, y, success);
+ adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success);
+
+@@ -534,17 +507,13 @@
+ fGlyphStorage->reset();
+ }
+
+-LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success)
++LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success)
+ {
+ // 3 -> kerning and ligatures
+- return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode,
+- languageCode, LE_DEFAULT_FEATURE_FLAG, success);
++ return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, languageCode, LE_DEFAULT_FEATURE_FLAG, success);
+ }
+
+-LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags,
+- LEErrorCode &success)
++LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
+ {
+ static const le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG;
+ static const le_uint32 mortTableTag = LE_MORT_TABLE_TAG;
+@@ -553,18 +522,12 @@
+ return NULL;
+ }
+
+- // code2000 has GPOS kern feature tags for latn script
+-
+- const GlyphSubstitutionTableHeader *gsubTable =
+- (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag);
++ const GlyphSubstitutionTableHeader *gsubTable = (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag);
+ LayoutEngine *result = NULL;
+ LETag scriptTag = 0x00000000;
+ LETag languageTag = 0x00000000;
+
+- if (gsubTable != NULL &&
+- gsubTable->coversScript(scriptTag =
+- OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
+-
++ if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
+ switch (scriptCode) {
+ case bengScriptCode:
+ case devaScriptCode:
+@@ -576,13 +539,11 @@
+ case tamlScriptCode:
+ case teluScriptCode:
+ case sinhScriptCode:
+- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags, gsubTable);
++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+ break;
+
+ case arabScriptCode:
+- result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags, gsubTable);
++ result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+ break;
+
+ case haniScriptCode:
+@@ -594,33 +555,33 @@
+ case zhtLanguageCode:
+ case zhsLanguageCode:
+ if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) {
+- result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags, gsubTable);
++ result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+ break;
+ }
+
+ // note: falling through to default case.
+ default:
+- result = new OpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags, gsubTable);
++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+ break;
+ }
+
+ break;
++#if 0
++ case tibtScriptCode:
++ result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ break;
++#endif
+
+ case khmrScriptCode:
+- result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags, gsubTable);
++ result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+ break;
+
+ default:
+- result = new OpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags, gsubTable);
++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+ break;
+ }
+ } else {
+- const MorphTableHeader *morphTable =
+- (MorphTableHeader *) fontInstance->getFontTable(mortTableTag);
++ const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag);
+
+ if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) {
+ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable);
+@@ -637,16 +598,18 @@
+ case teluScriptCode:
+ case sinhScriptCode:
+ {
+- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags);
++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
+ break;
+ }
+
+ case arabScriptCode:
+- result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode,
+- languageCode, typoFlags);
++ //case hebrScriptCode:
++ result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
+ break;
+
++ //case hebrScriptCode:
++ // return new HebrewOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
++
+ case thaiScriptCode:
+ result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
+ break;
+@@ -668,3 +631,5 @@
+ LayoutEngine::~LayoutEngine() {
+ delete fGlyphStorage;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.h b/src/share/native/sun/font/layout/LayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.h
+@@ -23,6 +23,7 @@
+ *
+ */
+
++
+ /*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+@@ -34,63 +35,61 @@
+
+ #include "LETypes.h"
+
+-#include <string.h>
++/**
++ * \file
++ * \brief C++ API: Virtual base class for complex text layout.
++ */
++
++U_NAMESPACE_BEGIN
+
+ class LEFontInstance;
+ class LEGlyphFilter;
+ class LEGlyphStorage;
+
+ /**
+- * This is a virtual base class used to do complex text layout. The
+- * text must all be in a single font, script, and language. An
+- * instance of a LayoutEngine can be created by calling the
+- * layoutEngineFactory method. Fonts are identified by instances of
+- * the LEFontInstance class. Script and language codes are identified
++ * This is a virtual base class used to do complex text layout. The text must all
++ * be in a single font, script, and language. An instance of a LayoutEngine can be
++ * created by calling the layoutEngineFactory method. Fonts are identified by
++ * instances of the LEFontInstance class. Script and language codes are identified
+ * by integer codes, which are defined in ScriptAndLanuageTags.h.
+ *
+- * Note that this class is not public API. It is declared public so
+- * that it can be exported from the library that it is a part of.
++ * Note that this class is not public API. It is declared public so that it can be
++ * exported from the library that it is a part of.
+ *
+- * The input to the layout process is an array of characters in
+- * logical order, and a starting X, Y position for the text. The
+- * output is an array of glyph indices, an array of character indices
+- * for the glyphs, and an array of glyph positions. These arrays are
+- * protected members of LayoutEngine which can be retreived by a
+- * public method. The reset method can be called to free these arrays
+- * so that the LayoutEngine can be reused.
++ * The input to the layout process is an array of characters in logical order,
++ * and a starting X, Y position for the text. The output is an array of glyph indices,
++ * an array of character indices for the glyphs, and an array of glyph positions.
++ * These arrays are protected members of LayoutEngine which can be retreived by a
++ * public method. The reset method can be called to free these arrays so that the
++ * LayoutEngine can be reused.
+ *
+- * The layout process is done in three steps. There is a protected
+- * virtual method for each step. These methods have a default
+- * implementation which only does character to glyph mapping and
+- * default positioning using the glyph's advance widths. Subclasses
+- * can override these methods for more advanced layout. There is a
+- * public method which invokes the steps in the correct order.
++ * The layout process is done in three steps. There is a protected virtual method
++ * for each step. These methods have a default implementation which only does
++ * character to glyph mapping and default positioning using the glyph's advance
++ * widths. Subclasses can override these methods for more advanced layout.
++ * There is a public method which invokes the steps in the correct order.
+ *
+ * The steps are:
+ *
+- * 1) Glyph processing - character to glyph mapping and any other
+- * glyph processing such as ligature substitution and contextual
+- * forms.
++ * 1) Glyph processing - character to glyph mapping and any other glyph processing
++ * such as ligature substitution and contextual forms.
+ *
+- * 2) Glyph positioning - position the glyphs based on their advance
+- * widths.
++ * 2) Glyph positioning - position the glyphs based on their advance widths.
+ *
+- * 3) Glyph position adjustments - adjustment of glyph positions for
+- * kerning, accent placement, etc.
++ * 3) Glyph position adjustments - adjustment of glyph positions for kerning,
++ * accent placement, etc.
+ *
+- * NOTE: in all methods below, output parameters are references to
+- * pointers so the method can allocate and free the storage as
+- * needed. All storage allocated in this way is owned by the object
+- * which created it, and will be freed when it is no longer needed, or
+- * when the object's destructor is invoked.
++ * NOTE: in all methods below, output parameters are references to pointers so
++ * the method can allocate and free the storage as needed. All storage allocated
++ * in this way is owned by the object which created it, and will be freed when it
++ * is no longer needed, or when the object's destructor is invoked.
+ *
+ * @see LEFontInstance
+ * @see ScriptAndLanguageTags.h
+ *
+ * @stable ICU 2.8
+ */
+-class U_LAYOUT_API LayoutEngine
+-{
++class U_LAYOUT_API LayoutEngine : public UObject {
+ protected:
+ /**
+ * The object which holds the glyph storage
+@@ -134,21 +133,21 @@
+ le_int32 fTypoFlags;
+
+ /**
+- * This constructs an instance for a given font, script and
+- * language. Subclass constructors
++ * This constructs an instance for a given font, script and language. Subclass constructors
+ * must call this constructor.
+ *
+ * @param fontInstance - the font for the text
+ * @param scriptCode - the script for the text
+ * @param languageCode - the language for the text
++ * @param typoFlags - the typographic control flags for the text. Set bit 1 if kerning
++ * is desired, set bit 2 if ligature formation is desired. Others are reserved.
+ *
+ * @see LEFontInstance
+ * @see ScriptAndLanguageTags.h
+ *
+ * @internal
+ */
+- LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, le_int32 typoFlags);
++ LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
+
+ /**
+ * This overrides the default no argument constructor to make it
+@@ -160,11 +159,10 @@
+ LayoutEngine();
+
+ /**
+- * This method does any required pre-processing to the input
+- * characters. It may generate output characters that differ from
+- * the input charcters due to insertions, deletions, or
+- * reorderings. In such cases, it will also generate an output
+- * character index array reflecting these changes.
++ * This method does any required pre-processing to the input characters. It
++ * may generate output characters that differ from the input charcters due to
++ * insertions, deletions, or reorderings. In such cases, it will also generate an
++ * output character index array reflecting these changes.
+ *
+ * Subclasses must override this method.
+ *
+@@ -173,44 +171,36 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - TRUE if the characters are in a right to
+- * left directional run
+- * @param outChars - the output character array, if different from
+- * the input
+- * @param glyphStorage - the object that holds the per-glyph
+- * storage. The character index array may be set.
++ * @param rightToLeft - TRUE if the characters are in a right to left directional run
++ * @param outChars - the output character array, if different from the input
++ * @param glyphStorage - the object that holds the per-glyph storage. The character index array may be set.
+ * @param success - set to an error code if the operation fails
+- * @return the output character count (input character count if no
+- * change)
++ *
++ * @return the output character count (input character count if no change)
+ *
+ * @internal
+ */
+- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+- * This method does the glyph processing. It converts an array of
+- * characters into an array of glyph indices and character
+- * indices. The characters to be processed are passed in a
+- * surrounding context. The context is specified as a starting
+- * address and a maximum character count. An offset and a count
+- * are used to specify the characters to be processed.
++ * This method does the glyph processing. It converts an array of characters
++ * into an array of glyph indices and character indices. The characters to be
++ * processed are passed in a surrounding context. The context is specified as
++ * a starting address and a maximum character count. An offset and a count are
++ * used to specify the characters to be processed.
+ *
+- * The default implementation of this method only does character
+- * to glyph mapping. Subclasses needing more elaborate glyph
+- * processing must override this method.
++ * The default implementation of this method only does character to glyph mapping.
++ * Subclasses needing more elaborate glyph processing must override this method.
+ *
+ * Input parameters:
+ * @param chars - the character context
+ * @param offset - the offset of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the context.
+- * @param rightToLeft - TRUE if the text is in a right to left
+- * directional run
+- * @param glyphStorage - the object which holds the per-glyph
+- * storage. The glyph and char indices arrays will be
+- * set.
++ * @param rightToLeft - TRUE if the text is in a right to left directional run
++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char indices arrays
++ * will be set.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+@@ -219,60 +209,50 @@
+ *
+ * @internal
+ */
+- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+- * This method does basic glyph positioning. The default
+- * implementation positions the glyphs based on their advance
+- * widths. This is sufficient for most uses. It is not expected
+- * that many subclasses will override this method.
++ * This method does basic glyph positioning. The default implementation positions
++ * the glyphs based on their advance widths. This is sufficient for most uses. It
++ * is not expected that many subclasses will override this method.
+ *
+ * Input parameters:
+- * @param glyphStorage - the object which holds the per-glyph storage.
+- * The glyph position array will be set.
++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph position array will be set.
+ * @param x - the starting X position
+ * @param y - the starting Y position
+ * @param success - set to an error code if the operation fails
+ *
+ * @internal
+ */
+- virtual void positionGlyphs(LEGlyphStorage &glyphStorage,
+- float x, float y, LEErrorCode &success);
++ virtual void positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success);
+
+ /**
+- * This method does positioning adjustments like accent
+- * positioning and kerning. The default implementation does
+- * nothing. Subclasses needing position adjustments must override
+- * this method.
++ * This method does positioning adjustments like accent positioning and
++ * kerning. The default implementation does nothing. Subclasses needing
++ * position adjustments must override this method.
+ *
+- * Note that this method has both characters and glyphs as input
+- * so that it can use the character codes to determine glyph types
+- * if that information isn't directly available. (e.g. Some Arabic
+- * OpenType fonts don't have a GDEF table)
++ * Note that this method has both characters and glyphs as input so that
++ * it can use the character codes to determine glyph types if that information
++ * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF
++ * table)
+ *
+ * @param chars - the input character context
+ * @param offset - the offset of the first character to process
+ * @param count - the number of characters to process
+- * @param reverse - <code>TRUE</code> if the glyphs in the glyph
+- * array have been reordered
+- * @param glyphStorage - the object which holds the per-glyph
+- * storage. The glyph positions will be adjusted as needed.
+- * @param success - output parameter set to an error code if the
+- * operation fails
++ * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered
++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be
++ * adjusted as needed.
++ * @param success - output parameter set to an error code if the operation fails
+ *
+ * @internal
+ */
+- virtual void adjustGlyphPositions(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_bool reverse,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+- * This method gets a table from the font associated with the
+- * text. The default implementation gets the table from the font
+- * instance. Subclasses which need to get the tables some other
+- * way must override this method.
++ * This method gets a table from the font associated with
++ * the text. The default implementation gets the table from
++ * the font instance. Subclasses which need to get the tables
++ * some other way must override this method.
+ *
+ * @param tableTag - the four byte table tag.
+ *
+@@ -283,127 +263,106 @@
+ virtual const void *getFontTable(LETag tableTag) const;
+
+ /**
+- * This method does character to glyph mapping. The default
+- * implementation uses the font instance to do the mapping. It
+- * will allocate the glyph and character index arrays if they're
+- * not already allocated. If it allocates the character index
+- * array, it will fill it it.
++ * This method does character to glyph mapping. The default implementation
++ * uses the font instance to do the mapping. It will allocate the glyph and
++ * character index arrays if they're not already allocated. If it allocates the
++ * character index array, it will fill it it.
+ *
+- * This method supports right to left text with the ability to
+- * store the glyphs in reverse order, and by supporting character
+- * mirroring, which will replace a character which has a left and
+- * right form, such as parens, with the opposite form before
+- * mapping it to a glyph index.
++ * This method supports right to left
++ * text with the ability to store the glyphs in reverse order, and by supporting
++ * character mirroring, which will replace a character which has a left and right
++ * form, such as parens, with the opposite form before mapping it to a glyph index.
+ *
+ * Input parameters:
+ * @param chars - the input character context
+ * @param offset - the offset of the first character to be mapped
+ * @param count - the number of characters to be mapped
+- * @param reverse - if <code>TRUE</code>, the output will be in
+- * reverse order
++ * @param reverse - if <code>TRUE</code>, the output will be in reverse order
+ * @param mirror - if <code>TRUE</code>, do character mirroring
+- * @param glyphStorage - the object which holds the per-glyph
+- * storage. The glyph and char indices arrays will be
+- * filled in.
++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char
++ * indices arrays will be filled in.
+ * @param success - set to an error code if the operation fails
+ *
+ * @see LEFontInstance
+ *
+ * @internal
+ */
+- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, le_bool mirror,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+- * This is a convenience method that forces the advance width of
+- * mark glyphs to be zero, which is required for proper selection
+- * and highlighting.
++ * This is a convenience method that forces the advance width of mark
++ * glyphs to be zero, which is required for proper selection and highlighting.
+ *
+- * @param glyphStorage - the object containing the per-glyph
+- * storage. The positions array will be modified.
++ * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified.
+ * @param markFilter - used to identify mark glyphs
+- * @param success - output parameter set to an error code if the
+- * operation fails
++ * @param success - output parameter set to an error code if the operation fails
+ *
+ * @see LEGlyphFilter
+ *
+ * @internal
+ */
+- static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage,
+- LEGlyphFilter *markFilter, LEErrorCode &success);
++ static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success);
+
+
+ /**
+- * This is a convenience method that forces the advance width of
+- * mark glyphs to be zero, which is required for proper selection
+- * and highlighting. This method uses the input characters to
+- * identify marks. This is required in cases where the font does
+- * not contain enough information to identify them based on the
+- * glyph IDs.
++ * This is a convenience method that forces the advance width of mark
++ * glyphs to be zero, which is required for proper selection and highlighting.
++ * This method uses the input characters to identify marks. This is required in
++ * cases where the font does not contain enough information to identify them based
++ * on the glyph IDs.
+ *
+ * @param chars - the array of input characters
+ * @param charCount - the number of input characers
+- * @param glyphStorage - the object containing the per-glyph
+- * storage. The positions array will be modified.
+- * @param reverse - <code>TRUE</code> if the glyph array has been
+- * reordered
++ * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified.
++ * @param reverse - <code>TRUE</code> if the glyph array has been reordered
+ * @param markFilter - used to identify mark glyphs
+- * @param success - output parameter set to an error code if the
+- * operation fails
++ * @param success - output parameter set to an error code if the operation fails
+ *
+ * @see LEGlyphFilter
+ *
+ * @internal
+ */
+- static void adjustMarkGlyphs(const LEUnicode chars[],
+- le_int32 charCount, le_bool reverse,
+- LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter,
+- LEErrorCode &success);
++ static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success);
++
+
+ public:
+ /**
+ * The destructor. It will free any storage allocated for the
+ * glyph, character index and position arrays by calling the reset
+- * method. It is declared virtual so that it will be invoked by
+- * the subclass destructors.
++ * method. It is declared virtual so that it will be invoked by the
++ * subclass destructors.
+ *
+ * @stable ICU 2.8
+ */
+ virtual ~LayoutEngine();
+
+ /**
+- * This method will invoke the layout steps in their correct order
+- * by calling the 32 bit versions of the computeGlyphs and
+- * positionGlyphs methods.(It doesn't * call the
+- * adjustGlyphPositions method because that doesn't apply for
+- * default * processing.) It will compute the glyph, character
+- * index and position arrays.
++ * This method will invoke the layout steps in their correct order by calling
++ * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods.. It will
++ * compute the glyph, character index and position arrays.
+ *
+ * @param chars - the input character context
+ * @param offset - the offset of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - true if the characers are in a right to
+- * left directional run
++ * @param rightToLeft - TRUE if the characers are in a right to left directional run
+ * @param x - the initial X position
+ * @param y - the initial Y position
+- * @param success - output parameter set to an error code if the
+- * operation fails
++ * @param success - output parameter set to an error code if the operation fails
++ *
+ * @return the number of glyphs in the glyph array
+ *
+- * Note: the glyph, character index and position array can be
+- * accessed using the getter method below.
++ * Note; the glyph, character index and position array can be accessed
++ * using the getter method below.
++ *
++ * @stable ICU 2.8
+ */
+- le_int32 layoutChars(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft, float x,
+- float y, LEErrorCode &success);
++ virtual le_int32 layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, float x, float y, LEErrorCode &success);
+
+ /**
+- * This method returns the number of glyphs in the glyph
+- * array. Note that the number of glyphs will be greater than or
+- * equal to the number of characters used to create the
+- * LayoutEngine.
++ * This method returns the number of glyphs in the glyph array. Note
++ * that the number of glyphs will be greater than or equal to the number
++ * of characters used to create the LayoutEngine.
+ *
+ * @return the number of glyphs in the glyph array
+ *
+@@ -412,9 +371,9 @@
+ le_int32 getGlyphCount() const;
+
+ /**
+- * This method copies the glyph array into a caller supplied
+- * array. The caller must ensure that the array is large enough
+- * to hold all the glyphs.
++ * This method copies the glyph array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold all
++ * the glyphs.
+ *
+ * @param glyphs - the destiniation glyph array
+ * @param success - set to an error code if the operation fails
+@@ -424,10 +383,10 @@
+ void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const;
+
+ /**
+- * This method copies the glyph array into a caller supplied
+- * array, ORing in extra bits. (This functionality is needed by
+- * the JDK, which uses 32 bits pre glyph idex, with the high 16
+- * bits encoding the composite font slot number)
++ * This method copies the glyph array into a caller supplied array,
++ * ORing in extra bits. (This functionality is needed by the JDK,
++ * which uses 32 bits pre glyph idex, with the high 16 bits encoding
++ * the composite font slot number)
+ *
+ * @param glyphs - the destination (32 bit) glyph array
+ * @param extraBits - this value will be ORed with each glyph index
+@@ -435,13 +394,12 @@
+ *
+ * @stable ICU 2.8
+ */
+- virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits,
+- LEErrorCode &success) const;
++ virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const;
+
+ /**
+- * This method copies the character index array into a caller
+- * supplied array. The caller must ensure that the array is large
+- * enough to hold a character index for each glyph.
++ * This method copies the character index array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold a
++ * character index for each glyph.
+ *
+ * @param charIndices - the destiniation character index array
+ * @param success - set to an error code if the operation fails
+@@ -451,9 +409,9 @@
+ void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const;
+
+ /**
+- * This method copies the character index array into a caller
+- * supplied array. The caller must ensure that the array is large
+- * enough to hold a character index for each glyph.
++ * This method copies the character index array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold a
++ * character index for each glyph.
+ *
+ * @param charIndices - the destiniation character index array
+ * @param indexBase - an offset which will be added to each index
+@@ -461,14 +419,13 @@
+ *
+ * @stable ICU 2.8
+ */
+- void getCharIndices(le_int32 charIndices[], le_int32 indexBase,
+- LEErrorCode &success) const;
++ void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const;
+
+ /**
+- * This method copies the position array into a caller supplied
+- * array. The caller must ensure that the array is large enough
+- * to hold an X and Y position for each glyph, plus an extra X and
+- * Y for the advance of the last glyph.
++ * This method copies the position array into a caller supplied array.
++ * The caller must ensure that the array is large enough to hold an
++ * X and Y position for each glyph, plus an extra X and Y for the
++ * advance of the last glyph.
+ *
+ * @param positions - the destiniation position array
+ * @param success - set to an error code if the operation fails
+@@ -491,8 +448,7 @@
+ *
+ * @stable ICU 2.8
+ */
+- void getGlyphPosition(le_int32 glyphIndex, float &x, float &y,
+- LEErrorCode &success) const;
++ void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const;
+
+ /**
+ * This method frees the glyph, character index and position arrays
+@@ -511,8 +467,7 @@
+ * @param fontInstance - the font of the text
+ * @param scriptCode - the script of the text
+ * @param languageCode - the language of the text
+- * @param success - output parameter set to an error code if the
+- * operation fails
++ * @param success - output parameter set to an error code if the operation fails
+ *
+ * @return a LayoutEngine which can layout text in the given font.
+ *
+@@ -520,17 +475,30 @@
+ *
+ * @stable ICU 2.8
+ */
+- static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success);
++ static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success);
+
+ /**
+ * Override of existing call that provides flags to control typography.
+ * @draft ICU 3.4
+ */
+- static LayoutEngine *layoutEngineFactory(
+- const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typo_flags, LEErrorCode &success);
++ static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typo_flags, LEErrorCode &success);
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/LayoutTables.h b/src/share/native/sun/font/layout/LayoutTables.h
+--- jdk/src/share/native/sun/font/layout/LayoutTables.h
++++ jdk/src/share/native/sun/font/layout/LayoutTables.h
+@@ -32,11 +32,20 @@
+ #ifndef __LAYOUTTABLES_H
+ #define __LAYOUTTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
+ #define ANY_NUMBER 1
+
+ typedef le_int16 ByteOffset;
+ typedef le_int16 WordOffset;
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.cpp b/src/share/native/sun/font/layout/LigatureSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp
+@@ -39,10 +39,14 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ #define ExtendedComplement(m) ((le_int32) (~((le_uint32) (m))))
+ #define SignBit(m) ((ExtendedComplement(m) >> 1) & (le_int32)(m))
+ #define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v))
+
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor)
++
+ LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader)
+ : StateTableProcessor(morphSubtableHeader)
+ {
+@@ -63,8 +67,7 @@
+ m = -1;
+ }
+
+-ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage,
+- le_int32 &currGlyph, EntryTableIndex index)
++ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
+ {
+ const LigatureSubstitutionStateEntry *entry = &entryTable[index];
+ ByteOffset newState = SWAPW(entry->newStateOffset);
+@@ -162,3 +165,5 @@
+ void LigatureSubstitutionProcessor::endStateTable()
+ {
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.h b/src/share/native/sun/font/layout/LigatureSubstProc.h
+--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.h
++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.h
+@@ -32,12 +32,19 @@
+ #ifndef __LIGATURESUBSTITUTIONPROCESSOR_H
+ #define __LIGATURESUBSTITUTIONPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "StateTableProcessor.h"
+ #include "LigatureSubstitution.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ #define nComponents 16
+@@ -54,6 +61,20 @@
+ LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader);
+ virtual ~LigatureSubstitutionProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ LigatureSubstitutionProcessor();
+
+@@ -68,6 +89,8 @@
+ le_int16 m;
+
+ const LigatureSubstitutionHeader *ligatureSubstitutionHeader;
++
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp b/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
+ *
+ */
+@@ -37,6 +38,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 LigatureSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+@@ -92,3 +95,5 @@
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.h b/src/share/native/sun/font/layout/LigatureSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h
+@@ -32,12 +32,19 @@
+ #ifndef __LIGATURESUBSTITUTIONSUBTABLES_H
+ #define __LIGATURESUBSTITUTIONSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct LigatureSetTable
+ {
+ le_uint16 ligatureCount;
+@@ -59,4 +66,5 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LigatureSubstitution.h b/src/share/native/sun/font/layout/LigatureSubstitution.h
+--- jdk/src/share/native/sun/font/layout/LigatureSubstitution.h
++++ jdk/src/share/native/sun/font/layout/LigatureSubstitution.h
+@@ -32,12 +32,19 @@
+ #ifndef __LIGATURESUBSTITUTION_H
+ #define __LIGATURESUBSTITUTION_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+ #include "StateTables.h"
+ #include "MorphTables.h"
+ #include "MorphStateTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct LigatureSubstitutionHeader : MorphStateTableHeader
+ {
+ ByteOffset ligatureActionTableOffset;
+@@ -65,4 +72,5 @@
+ lafComponentOffsetMask = 0x3FFFFFFF
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
+@@ -42,6 +42,8 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance) const
+ {
+@@ -65,10 +67,9 @@
+ return 1;
+ }
+
+-le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage,
+- GlyphPositionAdjustments *glyphPositionAdjustments,
+- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEFontInstance *fontInstance) const
++le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
++ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const LEFontInstance *fontInstance) const
+ {
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+
+@@ -140,8 +141,7 @@
+
+ LookupProcessor::LookupProcessor(const char *baseAddress,
+ Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset,
+- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap,
+- le_int32 featureMapCount, le_bool orderFeatures)
++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures)
+ : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0),
+ lookupOrderArray(NULL), lookupOrderCount(0)
+ {
+@@ -309,3 +309,5 @@
+ LE_DELETE_ARRAY(lookupOrderArray);
+ LE_DELETE_ARRAY(lookupSelectArray);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.h b/src/share/native/sun/font/layout/LookupProcessor.h
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.h
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.h
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -32,9 +33,18 @@
+ #ifndef __LOOKUPPROCESSOR_H
+ #define __LOOKUPPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
++//#include "Lookups.h"
++//#include "Features.h"
++
++U_NAMESPACE_BEGIN
+
+ class LEFontInstance;
+ class LEGlyphStorage;
+@@ -46,13 +56,10 @@
+ struct LookupSubtable;
+ struct LookupTable;
+
+-class LookupProcessor
+-{
++class LookupProcessor : public UMemory {
+ public:
+- le_int32 process(LEGlyphStorage &glyphStorage,
+- GlyphPositionAdjustments *glyphPositionAdjustments,
+- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEFontInstance *fontInstance) const;
++ le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
++ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance) const;
+
+ le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+
+@@ -64,19 +71,18 @@
+ virtual ~LookupProcessor();
+
+ protected:
+- LookupProcessor(const char *baseAddress,
++ LookupProcessor(const char *baseAddress,
+ Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset,
+- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap,
+- le_int32 featureMapCount, le_bool orderFeatures);
++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures);
+
+- LookupProcessor();
++ LookupProcessor();
+
+ le_int32 selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order);
+
+ const LookupListTable *lookupListTable;
+ const FeatureListTable *featureListTable;
+
+- FeatureMask *lookupSelectArray;
++ FeatureMask *lookupSelectArray;
+ le_uint32 lookupSelectCount;
+
+ le_uint16 *lookupOrderArray;
+@@ -88,4 +94,5 @@
+ LookupProcessor &operator=(const LookupProcessor &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LookupTables.cpp b/src/share/native/sun/font/layout/LookupTables.cpp
+--- jdk/src/share/native/sun/font/layout/LookupTables.cpp
++++ jdk/src/share/native/sun/font/layout/LookupTables.cpp
+@@ -34,6 +34,8 @@
+ #include "LookupTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ /*
+ These are the rolled-up versions of the uniform binary search.
+ Someday, if we need more performance, we can un-roll them.
+@@ -104,3 +106,5 @@
+
+ return NULL;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LookupTables.h b/src/share/native/sun/font/layout/LookupTables.h
+--- jdk/src/share/native/sun/font/layout/LookupTables.h
++++ jdk/src/share/native/sun/font/layout/LookupTables.h
+@@ -32,9 +32,16 @@
+ #ifndef __LOOKUPTABLES_H
+ #define __LOOKUPTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+
++U_NAMESPACE_BEGIN
++
+ enum LookupTableFormat
+ {
+ ltfSimpleArray = 0,
+@@ -104,4 +111,5 @@
+ LookupValue valueArray[ANY_NUMBER];
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/Lookups.cpp b/src/share/native/sun/font/layout/Lookups.cpp
+--- jdk/src/share/native/sun/font/layout/Lookups.cpp
++++ jdk/src/share/native/sun/font/layout/Lookups.cpp
+@@ -35,6 +35,8 @@
+ #include "CoverageTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ const LookupTable *LookupListTable::getLookupTable(le_uint16 lookupTableIndex) const
+ {
+ if (lookupTableIndex >= SWAPW(lookupCount)) {
+@@ -63,3 +65,5 @@
+
+ return coverageTable->getGlyphCoverage(glyphID);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/Lookups.h b/src/share/native/sun/font/layout/Lookups.h
+--- jdk/src/share/native/sun/font/layout/Lookups.h
++++ jdk/src/share/native/sun/font/layout/Lookups.h
+@@ -32,9 +32,16 @@
+ #ifndef __LOOKUPS_H
+ #define __LOOKUPS_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ enum LookupFlags
+ {
+ lfBaselineIsLogicalEnd = 0x0001, // The MS spec. calls this flag "RightToLeft" but this name is more accurate
+@@ -79,6 +86,5 @@
+ return getGlyphCoverage(coverageTableOffset, glyphID);
+ }
+
+-
+-
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/MPreFixups.cpp b/src/share/native/sun/font/layout/MPreFixups.cpp
+--- jdk/src/share/native/sun/font/layout/MPreFixups.cpp
++++ jdk/src/share/native/sun/font/layout/MPreFixups.cpp
+@@ -33,6 +33,8 @@
+ #include "LEGlyphStorage.h"
+ #include "MPreFixups.h"
+
++U_NAMESPACE_BEGIN
++
+ struct FixupData
+ {
+ le_int32 fBaseIndex;
+@@ -92,7 +94,7 @@
+
+ for (i = 0; i < mpreCount; i += 1) {
+ mpreSave[i] = glyphStorage[mpreIndex + i];
+- indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success);
++ indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i];
+ }
+
+ for (i = 0; i < moveCount; i += 1) {
+@@ -112,3 +114,5 @@
+ LE_DELETE_ARRAY(mpreSave);
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MPreFixups.h b/src/share/native/sun/font/layout/MPreFixups.h
+--- jdk/src/share/native/sun/font/layout/MPreFixups.h
++++ jdk/src/share/native/sun/font/layout/MPreFixups.h
+@@ -32,14 +32,22 @@
+ #ifndef __MPREFIXUPS_H
+ #define __MPREFIXUPS_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ // Might want to make this a private member...
+ struct FixupData;
+
+-class MPreFixups {
++class MPreFixups : public UMemory
++{
+ public:
+ MPreFixups(le_int32 charCount);
+ ~MPreFixups();
+@@ -53,4 +61,7 @@
+ le_int32 fFixupCount;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/MarkArrays.cpp b/src/share/native/sun/font/layout/MarkArrays.cpp
+--- jdk/src/share/native/sun/font/layout/MarkArrays.cpp
++++ jdk/src/share/native/sun/font/layout/MarkArrays.cpp
+@@ -36,6 +36,8 @@
+ #include "MarkArrays.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_int32 MarkArray::getMarkClass(LEGlyphID glyphID, le_int32 coverageIndex, const LEFontInstance *fontInstance,
+ LEPoint &anchor) const
+ {
+@@ -58,3 +60,5 @@
+
+ return markClass;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MarkArrays.h b/src/share/native/sun/font/layout/MarkArrays.h
+--- jdk/src/share/native/sun/font/layout/MarkArrays.h
++++ jdk/src/share/native/sun/font/layout/MarkArrays.h
+@@ -32,10 +32,17 @@
+ #ifndef __MARKARRAYS_H
+ #define __MARKARRAYS_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct MarkRecord
+ {
+ le_uint16 markClass;
+@@ -51,4 +58,7 @@
+ LEPoint &anchor) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+@@ -40,6 +40,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ LEGlyphID MarkToBasePositioningSubtable::findBaseGlyph(GlyphIterator *glyphIterator) const
+ {
+ if (glyphIterator->prev()) {
+@@ -106,7 +108,6 @@
+ glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition());
+
+ if (glyphIterator->isRightToLeft()) {
+- // dlf flip advance to local coordinate system
+ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY);
+ } else {
+ LEPoint baseAdvance;
+@@ -114,9 +115,10 @@
+ fontInstance->getGlyphAdvance(baseGlyph, pixels);
+ fontInstance->pixelsToUnits(pixels, baseAdvance);
+
+- // flip advances to local coordinate system
+ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY);
+ }
+
+ return 1;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h
+@@ -32,6 +32,11 @@
+ #ifndef __MARKTOBASEPOSITIONINGSUBTABLES_H
+ #define __MARKTOBASEPOSITIONINGSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "AttachmentPosnSubtables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct MarkToBasePositioningSubtable : AttachmentPositioningSubtable
+ {
+ le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+@@ -56,4 +63,6 @@
+ BaseRecord baseRecordArray[ANY_NUMBER];
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp
+@@ -39,6 +39,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ LEGlyphID MarkToLigaturePositioningSubtable::findLigatureGlyph(GlyphIterator *glyphIterator) const
+ {
+ if (glyphIterator->prev()) {
+@@ -117,9 +119,10 @@
+ fontInstance->getGlyphAdvance(ligatureGlyph, pixels);
+ fontInstance->pixelsToUnits(pixels, ligatureAdvance);
+
+- glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX,
+- anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY);
++ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY);
+ }
+
+ return 1;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h
+@@ -32,6 +32,11 @@
+ #ifndef __MARKTOLIGATUREPOSITIONINGSUBTABLES_H
+ #define __MARKTOLIGATUREPOSITIONINGSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "AttachmentPosnSubtables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct MarkToLigaturePositioningSubtable : AttachmentPositioningSubtable
+ {
+ le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+@@ -62,4 +69,6 @@
+ Offset ligatureAttachTableOffsetArray[ANY_NUMBER];
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp
+@@ -40,6 +40,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ LEGlyphID MarkToMarkPositioningSubtable::findMark2Glyph(GlyphIterator *glyphIterator) const
+ {
+ if (glyphIterator->findMark2Glyph()) {
+@@ -88,7 +90,7 @@
+ const AnchorTable *anchorTable = (const AnchorTable *) ((char *) mark2Array + anchorTableOffset);
+ LEPoint mark2Anchor, markAdvance, pixels;
+
+- if (anchorTableOffset == 0) { // jb4729
++ if (anchorTableOffset == 0) {
+ // this seems to mean that the marks don't attach...
+ return 0;
+ }
+@@ -111,9 +113,10 @@
+ fontInstance->getGlyphAdvance(mark2Glyph, pixels);
+ fontInstance->pixelsToUnits(pixels, mark2Advance);
+
+- glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX,
+- anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY);
++ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY);
+ }
+
+ return 1;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h
+@@ -32,6 +32,11 @@
+ #ifndef __MARKTOMARKPOSITIONINGSUBTABLES_H
+ #define __MARKTOMARKPOSITIONINGSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "AttachmentPosnSubtables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct MarkToMarkPositioningSubtable : AttachmentPositioningSubtable
+ {
+ le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+@@ -56,4 +63,6 @@
+ Mark2Record mark2RecordArray[ANY_NUMBER];
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/MirroredCharData.cpp b/src/share/native/sun/font/layout/MirroredCharData.cpp
+--- jdk/src/share/native/sun/font/layout/MirroredCharData.cpp
++++ jdk/src/share/native/sun/font/layout/MirroredCharData.cpp
+@@ -36,6 +36,8 @@
+ #include "LETypes.h"
+ #include "DefaultCharMapper.h"
+
++U_NAMESPACE_BEGIN
++
+ const LEUnicode32 DefaultCharMapper::mirroredChars[] = {
+ 0x0028, 0x0029, 0x003C, 0x003E, 0x005B, 0x005D, 0x007B, 0x007D,
+ 0x00AB, 0x00BB, 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E,
+@@ -127,3 +129,5 @@
+ };
+
+ const le_int32 DefaultCharMapper::mirroredCharsCount = 332;
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MorphStateTables.h b/src/share/native/sun/font/layout/MorphStateTables.h
+--- jdk/src/share/native/sun/font/layout/MorphStateTables.h
++++ jdk/src/share/native/sun/font/layout/MorphStateTables.h
+@@ -32,14 +32,22 @@
+ #ifndef __MORPHSTATETABLES_H
+ #define __MORPHSTATETABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+ #include "MorphTables.h"
+ #include "StateTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct MorphStateTableHeader : MorphSubtableHeader
+ {
+ StateTableHeader stHeader;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/MorphTables.cpp b/src/share/native/sun/font/layout/MorphTables.cpp
+--- jdk/src/share/native/sun/font/layout/MorphTables.cpp
++++ jdk/src/share/native/sun/font/layout/MorphTables.cpp
+@@ -42,6 +42,8 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const
+ {
+ const ChainHeader *chainHeader = chains;
+@@ -114,3 +116,5 @@
+ delete processor;
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MorphTables.h b/src/share/native/sun/font/layout/MorphTables.h
+--- jdk/src/share/native/sun/font/layout/MorphTables.h
++++ jdk/src/share/native/sun/font/layout/MorphTables.h
+@@ -32,9 +32,16 @@
+ #ifndef __MORPHTABLES_H
+ #define __MORPHTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ typedef le_uint32 FeatureFlags;
+@@ -98,4 +105,6 @@
+ void process(LEGlyphStorage &glyphStorage) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp b/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
+@@ -37,6 +37,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+@@ -106,3 +108,5 @@
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.h b/src/share/native/sun/font/layout/MultipleSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h
+@@ -32,12 +32,19 @@
+ #ifndef __MULTIPLESUBSTITUTIONSUBTABLES_H
+ #define __MULTIPLESUBSTITUTIONSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct SequenceTable
+ {
+ le_uint16 glyphCount;
+@@ -52,4 +59,5 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubst.h b/src/share/native/sun/font/layout/NonContextualGlyphSubst.h
+--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubst.h
++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubst.h
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
+ *
+ */
+@@ -32,14 +33,23 @@
+ #ifndef __NONCONTEXTUALGLYPHSUBSTITUTION_H
+ #define __NONCONTEXTUALGLYPHSUBSTITUTION_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+ #include "LookupTables.h"
+ #include "MorphTables.h"
+
++U_NAMESPACE_BEGIN
++
+ struct NonContextualGlyphSubstitutionHeader : MorphSubtableHeader
+ {
+ LookupTable table;
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp
+@@ -41,6 +41,8 @@
+ #include "TrimmedArrayProcessor.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor()
+ {
+ }
+@@ -79,3 +81,5 @@
+ return NULL;
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h
+--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h
++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h
+@@ -32,11 +32,18 @@
+ #ifndef __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H
+ #define __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "NonContextualGlyphSubst.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor
+@@ -57,4 +64,5 @@
+ NonContextualGlyphSubstitutionProcessor &operator=(const NonContextualGlyphSubstitutionProcessor &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+@@ -47,6 +47,10 @@
+
+ #include "GDEFMarkFilter.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine)
++
+ #define ccmpFeatureTag LE_CCMP_FEATURE_TAG
+ #define ligaFeatureTag LE_LIGA_FEATURE_TAG
+ #define cligFeatureTag LE_CLIG_FEATURE_TAG
+@@ -78,7 +82,7 @@
+ {ccmpFeatureTag, ccmpFeatureMask},
+ {ligaFeatureTag, ligaFeatureMask},
+ {cligFeatureTag, cligFeatureMask},
+- {kernFeatureTag, kernFeatureMask},
++ {kernFeatureTag, kernFeatureMask},
+ {paltFeatureTag, paltFeatureMask},
+ {markFeatureTag, markFeatureMask},
+ {mkmkFeatureTag, mkmkFeatureMask}
+@@ -86,19 +90,15 @@
+
+ static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap);
+
+-OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags,
+- const GlyphSubstitutionTableHeader *gsubTable)
+- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags),
+- fFeatureMask(minimalFeatures), fFeatureMap(featureMap),
+- fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE),
+- fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL),
+- fSubstitutionFilter(NULL)
++OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureMask(minimalFeatures),
++ fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE),
++ fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
+ {
+ static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG;
+ static const le_uint32 gposTableTag = LE_GPOS_TABLE_TAG;
+- const GlyphPositioningTableHeader *gposTable =
+- (const GlyphPositioningTableHeader *) getFontTable(gposTableTag);
++ const GlyphPositioningTableHeader *gposTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag);
+
+ applyTypoFlags();
+
+@@ -128,11 +128,10 @@
+ LayoutEngine::reset();
+ }
+
+-OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags),
+- fFeatureOrder(FALSE), fGSUBTable(NULL), fGDEFTable(NULL),
+- fGPOSTable(NULL), fSubstitutionFilter(NULL)
++OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags)
++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureOrder(FALSE),
++ fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
+ {
+ applyTypoFlags();
+ setScriptAndLanguageTags();
+@@ -171,9 +170,8 @@
+ fLangSysTag = getLangSysTag(fLanguageCode);
+ }
+
+-le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
+- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -184,8 +182,7 @@
+ return 0;
+ }
+
+- le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count,
+- max, rightToLeft, outChars, glyphStorage, success);
++ le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success);
+
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -203,16 +200,14 @@
+
+ // Input: characters, tags
+ // Output: glyphs, char indices
+-le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+
+- if (chars == NULL || offset < 0 || count < 0 || max < 0 ||
+- offset >= max || offset + count > max) {
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+ success = LE_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+@@ -224,16 +219,14 @@
+ }
+
+ if (fGSUBTable != NULL) {
+- count = fGSUBTable->process(glyphStorage, rightToLeft,
+- fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
+- fFeatureMap, fFeatureMapCount, fFeatureOrder);
++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ fFeatureMap, fFeatureMapCount, fFeatureOrder);
+ }
+
+ return count;
+ }
+
+-le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -247,9 +240,7 @@
+ return glyphStorage.getGlyphCount();
+ }
+
+-le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage,
+- LEErrorCode &success)
++le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ LEUnicode *outChars = NULL;
+ LEGlyphStorage fakeGlyphStorage;
+@@ -259,25 +250,19 @@
+ return 0;
+ }
+
+- if (chars == NULL || offset < 0 || count < 0 || max < 0 ||
+- offset >= max || offset + count > max) {
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+ success = LE_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+- outCharCount = characterProcessing(chars, offset, count, max, rightToLeft,
+- outChars, fakeGlyphStorage, success);
++ outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success);
+
+ if (outChars != NULL) {
+- fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount,
+- rightToLeft, fakeGlyphStorage, success);
+- // FIXME: a subclass may have allocated this, in which case
+- // this delete might not work...
+- LE_DELETE_ARRAY(outChars);
++ fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success);
++ LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work...
+ //adjustGlyphs(outChars, 0, outCharCount, rightToLeft, fakeGlyphs, fakeGlyphCount);
+ } else {
+- fakeGlyphCount = glyphProcessing(chars, offset, count, max, rightToLeft,
+- fakeGlyphStorage, success);
++ fakeGlyphCount = glyphProcessing(chars, offset, count, max, rightToLeft, fakeGlyphStorage, success);
+ //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount);
+ }
+
+@@ -287,8 +272,8 @@
+ }
+
+ // apply GPOS table, if any
+-void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+@@ -324,8 +309,8 @@
+ }
+ #endif
+
+- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag,
+- fGDEFTable, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder);
++ fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, fFontInstance,
++ fFeatureMap, fFeatureMapCount, fFeatureOrder);
+
+ float xAdjust = 0, yAdjust = 0;
+
+@@ -360,4 +345,12 @@
+
+ delete adjustments;
+ }
++
++#if 0
++ // Don't know why this is here...
++ LE_DELETE_ARRAY(fFeatureTags);
++ fFeatureTags = NULL;
++#endif
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+@@ -23,9 +23,7 @@
+ *
+ */
+
+-
+ /*
+- *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+@@ -42,6 +40,8 @@
+ #include "GlyphDefinitionTables.h"
+ #include "GlyphPositioningTables.h"
+
++U_NAMESPACE_BEGIN
++
+ /**
+ * OpenTypeLayoutEngine implements complex text layout for OpenType fonts - that is
+ * fonts which have GSUB and GPOS tables associated with them. In order to do this,
+@@ -87,7 +87,7 @@
+ * @internal
+ */
+ OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -95,11 +95,12 @@
+ *
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+- * @param languageCode - the language
++ * @param langaugeCode - the language
+ *
+ * @internal
+ */
+- OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
++ OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -132,6 +133,20 @@
+ */
+ static LETag getLangSysTag(le_int32 languageCode);
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+
+ /**
+@@ -259,9 +274,8 @@
+ *
+ * @internal
+ */
+- virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool /*rightToLeft*/,
+- LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/,
++ LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method does character to glyph mapping, and applies the GSUB table. The
+@@ -292,9 +306,8 @@
+ *
+ * @internal
+ */
+- virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method does any processing necessary to convert "fake"
+@@ -321,8 +334,7 @@
+ *
+ * @internal
+ */
+- virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method applies the characterProcessing, glyphProcessing and glyphPostProcessing
+@@ -346,8 +358,7 @@
+ *
+ * @internal
+ */
+- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count,
+- le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method uses the GPOS table, if there is one, to adjust the glyph positions.
+@@ -364,8 +375,7 @@
+ *
+ * @internal
+ */
+- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count,
+- le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ /**
+ * This method frees the feature tag array so that the
+@@ -377,4 +387,6 @@
+ virtual void reset();
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/OpenTypeTables.h b/src/share/native/sun/font/layout/OpenTypeTables.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeTables.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeTables.h
+@@ -32,8 +32,15 @@
+ #ifndef __OPENTYPETABLES_H
+ #define __OPENTYPETABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
+ #define ANY_NUMBER 1
+
+ typedef le_uint16 Offset;
+@@ -62,4 +69,5 @@
+ FeatureMask mask;
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.cpp b/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+@@ -34,6 +34,8 @@
+ #include "OpenTypeUtilities.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ //
+ // Finds the high bit by binary searching
+ // through the bits in n.
+@@ -192,3 +194,7 @@
+ array[i + 1] = v;
+ }
+ }
++
++
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.h b/src/share/native/sun/font/layout/OpenTypeUtilities.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h
+@@ -32,10 +32,17 @@
+ #ifndef __OPENTYPEUTILITIES_H
+ #define __OPENTYPEUTILITIES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
+-class OpenTypeUtilities {
++U_NAMESPACE_BEGIN
++
++class OpenTypeUtilities /* not : public UObject because all methods are static */ {
+ public:
+ static le_int8 highBit(le_int32 value);
+ static Offset getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount);
+@@ -48,4 +55,5 @@
+ OpenTypeUtilities() {} // private - forbid instantiation
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
+@@ -39,6 +39,8 @@
+ #include "OpenTypeUtilities.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 PairPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
+ {
+ switch(SWAPW(subtableFormat))
+@@ -82,8 +84,7 @@
+ const PairValueRecord *pairValueRecord = NULL;
+
+ if (pairValueCount != 0) {
+- pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph),
+- pairSetTable->pairValueRecordArray, pairValueCount, recordSize);
++ pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), pairSetTable->pairValueRecordArray, pairValueCount, recordSize);
+ }
+
+ if (pairValueRecord == NULL) {
+@@ -91,8 +92,7 @@
+ }
+
+ if (valueFormat1 != 0) {
+- pairValueRecord->valueRecord1.adjustPosition(SWAPW(valueFormat1), (char *) this,
+- tempIterator, fontInstance);
++ pairValueRecord->valueRecord1.adjustPosition(SWAPW(valueFormat1), (char *) this, tempIterator, fontInstance);
+ }
+
+ if (valueFormat2 != 0) {
+@@ -171,3 +171,5 @@
+
+ return NULL;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.h b/src/share/native/sun/font/layout/PairPositioningSubtables.h
+--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h
++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h
+@@ -32,6 +32,11 @@
+ #ifndef __PAIRPOSITIONINGSUBTABLES_H
+ #define __PAIRPOSITIONINGSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "ValueRecords.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ // NOTE: ValueRecord has a variable size
+ struct PairValueRecord
+ {
+@@ -96,4 +103,7 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.cpp b/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
+ *
+ */
+@@ -35,6 +36,8 @@
+ #include "ScriptAndLanguage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ const LangSysTable *ScriptTable::findLanguage(LETag languageTag, le_bool exactMatch) const
+ {
+ le_uint16 count = SWAPW(langSysCount);
+@@ -79,3 +82,5 @@
+
+ return scriptTable->findLanguage(languageTag, exactMatch);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.h b/src/share/native/sun/font/layout/ScriptAndLanguage.h
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h
+@@ -32,9 +32,16 @@
+ #ifndef __SCRIPTANDLANGUAGE_H
+ #define __SCRIPTANDLANGUAGE_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ typedef TagAndOffsetRecord LangSysRecord;
+
+ struct LangSysTable
+@@ -65,4 +72,6 @@
+ const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp b/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp
+@@ -35,6 +35,8 @@
+ #include "ScriptAndLanguageTags.h"
+ #include "OpenTypeLayoutEngine.h"
+
++U_NAMESPACE_BEGIN
++
+ const LETag OpenTypeLayoutEngine::scriptTags[] = {
+ zyyyScriptTag, /* 'zyyy' (COMMON) */
+ qaaiScriptTag, /* 'qaai' (INHERITED) */
+@@ -125,3 +127,5 @@
+ zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */
+ zhtLanguageTag /* 'ZHT' (Chinese (Traditional)) */
+ };
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.h b/src/share/native/sun/font/layout/ScriptAndLanguageTags.h
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h
+@@ -36,6 +36,13 @@
+
+ #include "LETypes.h"
+
++U_NAMESPACE_BEGIN
++
++/**
++ * \file
++ * \internal
++ */
++
+ const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */
+ const LETag qaaiScriptTag = 0x71616169; /* 'qaai' (INHERITED) */
+ const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */
+@@ -126,4 +133,6 @@
+ const LETag zhsLanguageTag = 0x5A485320; /* 'ZHS' (Chinese (Simplified)) */
+ const LETag zhtLanguageTag = 0x5A485420; /* 'ZHT' (Chinese (Traditional)) */
+
++
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp b/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+@@ -38,6 +38,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor)
++
+ SegmentArrayProcessor::SegmentArrayProcessor()
+ {
+ }
+@@ -77,3 +81,5 @@
+ }
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.h b/src/share/native/sun/font/layout/SegmentArrayProcessor.h
+--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h
++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h
+@@ -32,12 +32,19 @@
+ #ifndef __SEGMENTARRAYPROCESSOR_H
+ #define __SEGMENTARRAYPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "NonContextualGlyphSubst.h"
+ #include "NonContextualGlyphSubstProc.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor
+@@ -49,11 +56,28 @@
+
+ virtual ~SegmentArrayProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ SegmentArrayProcessor();
+
+ protected:
+ const SegmentArrayLookupTable *segmentArrayLookupTable;
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp b/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp
+@@ -38,6 +38,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentSingleProcessor)
++
+ SegmentSingleProcessor::SegmentSingleProcessor()
+ {
+ }
+@@ -71,3 +75,5 @@
+ }
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.h b/src/share/native/sun/font/layout/SegmentSingleProcessor.h
+--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h
++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h
+@@ -32,12 +32,19 @@
+ #ifndef __SEGMENTSINGLEPROCESSOR_H
+ #define __SEGMENTSINGLEPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "NonContextualGlyphSubst.h"
+ #include "NonContextualGlyphSubstProc.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor
+@@ -49,11 +56,28 @@
+
+ virtual ~SegmentSingleProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ SegmentSingleProcessor();
+
+ protected:
+ const SegmentSingleLookupTable *segmentSingleLookupTable;
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/ShapingTypeData.cpp b/src/share/native/sun/font/layout/ShapingTypeData.cpp
+--- jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp
++++ jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp
+@@ -36,6 +36,8 @@
+ #include "LETypes.h"
+ #include "ArabicShaping.h"
+
++U_NAMESPACE_BEGIN
++
+ const le_uint8 ArabicShaping::shapingTypeTable[] = {
+ 0x00, 0x02, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05,
+ 0x04, 0x83, 0x04, 0x86, 0x00, 0x05, 0x04, 0x88, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xB9,
+@@ -104,3 +106,5 @@
+ 0xFE, 0x20, 0xFE, 0x23, 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB,
+ 0x00, 0x05
+ };
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp b/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp
+@@ -38,6 +38,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleArrayProcessor)
++
+ SimpleArrayProcessor::SimpleArrayProcessor()
+ {
+ }
+@@ -68,3 +72,5 @@
+ }
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.h b/src/share/native/sun/font/layout/SimpleArrayProcessor.h
+--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h
++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h
+@@ -32,12 +32,19 @@
+ #ifndef __SIMPLEARRAYPROCESSOR_H
+ #define __SIMPLEARRAYPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "NonContextualGlyphSubst.h"
+ #include "NonContextualGlyphSubstProc.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor
+@@ -49,11 +56,28 @@
+
+ virtual ~SimpleArrayProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ SimpleArrayProcessor();
+
+ protected:
+ const SimpleArrayLookupTable *simpleArrayLookupTable;
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp b/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp
+@@ -38,6 +38,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 SinglePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
+ {
+ switch(SWAPW(subtableFormat))
+@@ -84,11 +86,12 @@
+ le_int16 coverageIndex = (le_int16) getGlyphCoverage(glyph);
+
+ if (coverageIndex >= 0) {
+- valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this,
+- *glyphIterator, fontInstance);
++ valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance);
+
+ return 1;
+ }
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.h b/src/share/native/sun/font/layout/SinglePositioningSubtables.h
+--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h
++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h
+@@ -32,6 +32,11 @@
+ #ifndef __SINGLEPOSITIONINGSUBTABLES_H
+ #define __SINGLEPOSITIONINGSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "ValueRecords.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct SinglePositioningSubtable : GlyphPositioningSubtable
+ {
+ le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+@@ -61,4 +68,7 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp
+@@ -37,6 +37,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
+ {
+ switch(SWAPW(subtableFormat))
+@@ -98,3 +100,5 @@
+
+ return 0;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h
+--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h
++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h
+@@ -32,12 +32,19 @@
+ #ifndef __SINGLESUBSTITUTIONSUBTABLES_H
+ #define __SINGLESUBSTITUTIONSUBTABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ struct SingleSubstitutionSubtable : GlyphSubstitutionSubtable
+ {
+ le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
+@@ -58,4 +65,7 @@
+ le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
+ };
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.cpp b/src/share/native/sun/font/layout/SingleTableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp
+@@ -38,6 +38,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SingleTableProcessor)
++
+ SingleTableProcessor::SingleTableProcessor()
+ {
+ }
+@@ -68,3 +72,5 @@
+ }
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.h b/src/share/native/sun/font/layout/SingleTableProcessor.h
+--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.h
++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.h
+@@ -32,12 +32,19 @@
+ #ifndef __SINGLETABLEPROCESSOR_H
+ #define __SINGLETABLEPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "NonContextualGlyphSubst.h"
+ #include "NonContextualGlyphSubstProc.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor
+@@ -49,11 +56,27 @@
+
+ virtual ~SingleTableProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ SingleTableProcessor();
+
+ protected:
+ const SingleTableLookupTable *singleTableLookupTable;
++
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/StateTableProcessor.cpp b/src/share/native/sun/font/layout/StateTableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
+@@ -38,6 +38,8 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ StateTableProcessor::StateTableProcessor()
+ {
+ }
+@@ -101,3 +103,5 @@
+
+ endStateTable();
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/StateTableProcessor.h b/src/share/native/sun/font/layout/StateTableProcessor.h
+--- jdk/src/share/native/sun/font/layout/StateTableProcessor.h
++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.h
+@@ -32,11 +32,18 @@
+ #ifndef __STATETABLEPROCESSOR_H
+ #define __STATETABLEPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "MorphStateTables.h"
+ #include "SubtableProcessor.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class StateTableProcessor : public SubtableProcessor
+@@ -72,4 +79,5 @@
+ StateTableProcessor &operator=(const StateTableProcessor &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/StateTables.h b/src/share/native/sun/font/layout/StateTables.h
+--- jdk/src/share/native/sun/font/layout/StateTables.h
++++ jdk/src/share/native/sun/font/layout/StateTables.h
+@@ -32,6 +32,11 @@
+ #ifndef __STATETABLES_H
+ #define __STATETABLES_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+
+@@ -70,6 +75,8 @@
+ #define LE_STATE_PATIENCE_INCR(x) if((x)!=le_patience_curr) ++le_patience_count;
+
+
++U_NAMESPACE_BEGIN
++
+ struct StateTableHeader
+ {
+ le_int16 stateSize;
+@@ -113,4 +120,6 @@
+ le_int16 flags;
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.cpp b/src/share/native/sun/font/layout/SubstitutionLookups.cpp
+--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp
++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp
+@@ -39,6 +39,8 @@
+ #include "CoverageTables.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ /*
+ NOTE: This could be optimized somewhat by keeping track
+ of the previous sequenceIndex in the loop and doing next()
+@@ -65,3 +67,5 @@
+ lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance);
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.h b/src/share/native/sun/font/layout/SubstitutionLookups.h
+--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.h
++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.h
+@@ -32,6 +32,11 @@
+ #ifndef __SUBSTITUTIONLOOKUPS_H
+ #define __SUBSTITUTIONLOOKUPS_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+@@ -39,6 +44,8 @@
+ #include "GlyphIterator.h"
+ #include "LookupProcessor.h"
+
++U_NAMESPACE_BEGIN
++
+ struct SubstitutionLookupRecord
+ {
+ le_uint16 sequenceIndex;
+@@ -56,4 +63,6 @@
+ le_int32 position);
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/SubtableProcessor.cpp b/src/share/native/sun/font/layout/SubtableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp
+@@ -34,6 +34,8 @@
+ #include "SubtableProcessor.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ SubtableProcessor::SubtableProcessor()
+ {
+ }
+@@ -50,3 +52,5 @@
+ SubtableProcessor::~SubtableProcessor()
+ {
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SubtableProcessor.h b/src/share/native/sun/font/layout/SubtableProcessor.h
+--- jdk/src/share/native/sun/font/layout/SubtableProcessor.h
++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.h
+@@ -32,13 +32,19 @@
+ #ifndef __SUBTABLEPROCESSOR_H
+ #define __SUBTABLEPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+-class SubtableProcessor
+-{
++class SubtableProcessor : public UMemory {
+ public:
+ virtual void process(LEGlyphStorage &glyphStorage) = 0;
+ virtual ~SubtableProcessor();
+@@ -60,4 +66,6 @@
+ SubtableProcessor &operator=(const SubtableProcessor &other); // forbid copying of this class
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp b/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
+@@ -38,8 +38,11 @@
+
+ #include "ThaiShaping.h"
+
+-ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance,
+- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine)
++
++ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
+ {
+ fErrorChar = 0x25CC;
+@@ -73,16 +76,13 @@
+ // Output: glyphs, char indices
+ // Returns: the glyph count
+ // NOTE: this assumes that ThaiShaping::compose will allocate the outChars array...
+-le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool /*rightToLeft*/,
+- LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+
+- if (chars == NULL || offset < 0 || count < 0 || max < 0 ||
+- offset >= max || offset + count > max) {
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+ success = LE_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+@@ -107,8 +107,7 @@
+ return 0;
+ }
+
+- glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar,
+- outChars, glyphStorage);
++ glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, outChars, glyphStorage);
+ mapCharsToGlyphs(outChars, 0, glyphCount, FALSE, FALSE, glyphStorage, success);
+
+ LE_DELETE_ARRAY(outChars);
+@@ -116,3 +115,5 @@
+ glyphStorage.adoptGlyphCount(glyphCount);
+ return glyphCount;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.h b/src/share/native/sun/font/layout/ThaiLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h
+@@ -39,6 +39,8 @@
+
+ #include "ThaiShaping.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ /**
+@@ -66,8 +68,7 @@
+ *
+ * @internal
+ */
+- ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
+- le_int32 languageCode, le_int32 typoFlags);
++ ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -76,6 +77,20 @@
+ */
+ virtual ~ThaiLayoutEngine();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ protected:
+ /**
+ * A small integer indicating which Thai encoding
+@@ -109,10 +124,8 @@
+ * @param offset - the index of the first character to process
+ * @param count - the number of characters to process
+ * @param max - the number of characters in the input context
+- * @param rightToLeft - <code>TRUE</code> if the text is in a
+- * right to left directional run
+- * @param glyphStorage - the glyph storage object. The glyph and
+- * char index arrays will be set.
++ * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run
++ * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set.
+ *
+ * Output parameters:
+ * @param success - set to an error code if the operation fails
+@@ -123,10 +136,11 @@
+ *
+ * @internal
+ */
+- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset,
+- le_int32 count, le_int32 max, le_bool rightToLeft,
++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/ThaiShaping.cpp b/src/share/native/sun/font/layout/ThaiShaping.cpp
+--- jdk/src/share/native/sun/font/layout/ThaiShaping.cpp
++++ jdk/src/share/native/sun/font/layout/ThaiShaping.cpp
+@@ -35,6 +35,8 @@
+ #include "LEGlyphStorage.h"
+ #include "ThaiShaping.h"
+
++U_NAMESPACE_BEGIN
++
+ enum {
+ CH_SPACE = 0x0020,
+ CH_YAMAKKAN = 0x0E4E,
+@@ -248,9 +250,8 @@
+ return transition.nextState;
+ }
+
+-le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex,
+- le_uint8 glyphSet, LEUnicode errorChar,
+- le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex)
++le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar,
++ le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex)
+ {
+ StateTransition transition;
+
+@@ -327,3 +328,5 @@
+
+ return outputIndex;
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ThaiShaping.h b/src/share/native/sun/font/layout/ThaiShaping.h
+--- jdk/src/share/native/sun/font/layout/ThaiShaping.h
++++ jdk/src/share/native/sun/font/layout/ThaiShaping.h
+@@ -32,13 +32,20 @@
+ #ifndef __THAISHAPING_H
+ #define __THAISHAPING_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEGlyphFilter.h"
+ #include "OpenTypeTables.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+-class ThaiShaping {
++class ThaiShaping /* not : public UObject because all methods are static */ {
+ public:
+
+ enum {
+@@ -120,4 +127,7 @@
+ return thaiStateTable[state][currClass];
+ }
+
++U_NAMESPACE_END
+ #endif
++
++
+diff --git a/src/share/native/sun/font/layout/ThaiStateTables.cpp b/src/share/native/sun/font/layout/ThaiStateTables.cpp
+--- jdk/src/share/native/sun/font/layout/ThaiStateTables.cpp
++++ jdk/src/share/native/sun/font/layout/ThaiStateTables.cpp
+@@ -25,6 +25,7 @@
+
+ /*
+ *
++ *
+ * (C) Copyright IBM Corp. 1999-2003 - All Rights Reserved
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+@@ -35,6 +36,8 @@
+ #include "LETypes.h"
+ #include "ThaiShaping.h"
+
++U_NAMESPACE_BEGIN
++
+ const le_uint8 ThaiShaping::classTable[] = {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ // -------------------------------------------------------------------------------
+@@ -105,3 +108,5 @@
+ /*50*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {51, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}},
+ /*51*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}
+ };
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp b/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp
+@@ -38,6 +38,10 @@
+ #include "LEGlyphStorage.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TrimmedArrayProcessor)
++
+ TrimmedArrayProcessor::TrimmedArrayProcessor()
+ {
+ }
+@@ -72,3 +76,5 @@
+ }
+ }
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.h b/src/share/native/sun/font/layout/TrimmedArrayProcessor.h
+--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h
++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h
+@@ -32,12 +32,19 @@
+ #ifndef __TRIMMEDARRAYPROCESSOR_H
+ #define __TRIMMEDARRAYPROCESSOR_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "MorphTables.h"
+ #include "SubtableProcessor.h"
+ #include "NonContextualGlyphSubst.h"
+ #include "NonContextualGlyphSubstProc.h"
+
++U_NAMESPACE_BEGIN
++
+ class LEGlyphStorage;
+
+ class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor
+@@ -49,6 +56,20 @@
+
+ virtual ~TrimmedArrayProcessor();
+
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
+ private:
+ TrimmedArrayProcessor();
+
+@@ -56,6 +77,9 @@
+ TTGlyphID firstGlyph;
+ TTGlyphID lastGlyph;
+ const TrimmedArrayLookupTable *trimmedArrayLookupTable;
++
+ };
+
++U_NAMESPACE_END
+ #endif
++
+diff --git a/src/share/native/sun/font/layout/ValueRecords.cpp b/src/share/native/sun/font/layout/ValueRecords.cpp
+--- jdk/src/share/native/sun/font/layout/ValueRecords.cpp
++++ jdk/src/share/native/sun/font/layout/ValueRecords.cpp
+@@ -37,6 +37,8 @@
+ #include "GlyphIterator.h"
+ #include "LESwaps.h"
+
++U_NAMESPACE_BEGIN
++
+ #define Nibble(value, nibble) ((value >> (nibble * 4)) & 0xF)
+ #define NibbleBits(value, nibble) (bitsInNibble[Nibble(value, nibble)])
+
+@@ -161,8 +163,8 @@
+ xPlacementAdjustment, yPlacementAdjustment, xAdvanceAdjustment, yAdvanceAdjustment);
+ }
+
+-void ValueRecord::adjustPosition(le_int16 index, ValueFormat valueFormat, const char *base,
+- GlyphIterator &glyphIterator, const LEFontInstance *fontInstance) const
++void ValueRecord::adjustPosition(le_int16 index, ValueFormat valueFormat, const char *base, GlyphIterator &glyphIterator,
++ const LEFontInstance *fontInstance) const
+ {
+ float xPlacementAdjustment = 0;
+ float yPlacementAdjustment = 0;
+@@ -323,3 +325,5 @@
+
+ return getFieldCount(valueFormat & beforeMasks[field]);
+ }
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ValueRecords.h b/src/share/native/sun/font/layout/ValueRecords.h
+--- jdk/src/share/native/sun/font/layout/ValueRecords.h
++++ jdk/src/share/native/sun/font/layout/ValueRecords.h
+@@ -32,11 +32,18 @@
+ #ifndef __VALUERECORDS_H
+ #define __VALUERECORDS_H
+
++/**
++ * \file
++ * \internal
++ */
++
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+ #include "GlyphIterator.h"
+
++U_NAMESPACE_BEGIN
++
+ typedef le_uint16 ValueFormat;
+ typedef le_int16 ValueRecordField;
+
+@@ -84,5 +91,7 @@
+ vfbAnyDevice = vfbXPlaDevice + vfbYPlaDevice + vfbXAdvDevice + vfbYAdvDevice
+ };
+
++U_NAMESPACE_END
++#endif
+
+-#endif
++
diff --git a/java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch b/java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch
new file mode 100644
index 000000000000..5e0f001e7b35
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch
@@ -0,0 +1,355 @@
+# HG changeset patch
+# User andrew
+# Date 1365686276 -3600
+# Node ID a939f541de9af5ccb78225c27cd46cd7dc6bcf87
+# Parent 9745a1f43592582cce60d8632d614fafc7dfdc3c
+6669869: Beans.isDesignTime() and other queries should be per-AppContext
+Reviewed-by: peterz, rupashka
+
+diff --git a/src/share/classes/java/beans/Beans.java b/src/share/classes/java/beans/Beans.java
+--- jdk/src/share/classes/java/beans/Beans.java
++++ jdk/src/share/classes/java/beans/Beans.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -27,26 +27,41 @@
+
+ import com.sun.beans.finder.ClassFinder;
+
+-import java.applet.*;
++import java.applet.Applet;
++import java.applet.AppletContext;
++import java.applet.AppletStub;
++import java.applet.AudioClip;
+
+-import java.awt.*;
+-
+-import java.beans.AppletInitializer;
++import java.awt.GraphicsEnvironment;
++import java.awt.Image;
+
+ import java.beans.beancontext.BeanContext;
+
+-import java.io.*;
+-
+-import java.lang.reflect.Constructor;
++import java.io.IOException;
++import java.io.InputStream;
++import java.io.ObjectInputStream;
++import java.io.ObjectStreamClass;
++import java.io.StreamCorruptedException;
+
+ import java.net.URL;
+-import java.lang.reflect.Array;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++
++import java.util.Enumeration;
++import java.util.Hashtable;
++import java.util.Iterator;
++import java.util.Vector;
++
++import sun.awt.AppContext;
+
+ /**
+ * This class provides some general purpose beans control methods.
+ */
+
+ public class Beans {
++ private static final Object DESIGN_TIME = new Object();
++ private static final Object GUI_AVAILABLE = new Object();
+
+ /**
+ * <p>
+@@ -59,12 +74,12 @@
+ * @param beanName the name of the bean within the class-loader.
+ * For example "sun.beanbox.foobah"
+ *
+- * @exception java.lang.ClassNotFoundException if the class of a serialized
++ * @exception ClassNotFoundException if the class of a serialized
+ * object could not be found.
+- * @exception java.io.IOException if an I/O error occurs.
++ * @exception IOException if an I/O error occurs.
+ */
+
+- public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException {
++ public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException {
+ return Beans.instantiate(cls, beanName, null, null);
+ }
+
+@@ -80,12 +95,12 @@
+ * For example "sun.beanbox.foobah"
+ * @param beanContext The BeanContext in which to nest the new bean
+ *
+- * @exception java.lang.ClassNotFoundException if the class of a serialized
++ * @exception ClassNotFoundException if the class of a serialized
+ * object could not be found.
+- * @exception java.io.IOException if an I/O error occurs.
++ * @exception IOException if an I/O error occurs.
+ */
+
+- public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException {
++ public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException {
+ return Beans.instantiate(cls, beanName, beanContext, null);
+ }
+
+@@ -135,19 +150,19 @@
+ * @param beanContext The BeanContext in which to nest the new bean
+ * @param initializer The AppletInitializer for the new bean
+ *
+- * @exception java.lang.ClassNotFoundException if the class of a serialized
++ * @exception ClassNotFoundException if the class of a serialized
+ * object could not be found.
+- * @exception java.io.IOException if an I/O error occurs.
++ * @exception IOException if an I/O error occurs.
+ */
+
+ public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer)
+- throws java.io.IOException, ClassNotFoundException {
++ throws IOException, ClassNotFoundException {
+
+- java.io.InputStream ins;
+- java.io.ObjectInputStream oins = null;
++ InputStream ins;
++ ObjectInputStream oins = null;
+ Object result = null;
+ boolean serialized = false;
+- java.io.IOException serex = null;
++ IOException serex = null;
+
+ // If the given classloader is null, we check if an
+ // system classloader is available and (if so)
+@@ -166,8 +181,8 @@
+ // Try to find a serialized object with this name
+ final String serName = beanName.replace('.','/').concat(".ser");
+ final ClassLoader loader = cls;
+- ins = (InputStream)java.security.AccessController.doPrivileged
+- (new java.security.PrivilegedAction() {
++ ins = (InputStream)AccessController.doPrivileged
++ (new PrivilegedAction() {
+ public Object run() {
+ if (loader == null)
+ return ClassLoader.getSystemResourceAsStream(serName);
+@@ -185,7 +200,7 @@
+ result = oins.readObject();
+ serialized = true;
+ oins.close();
+- } catch (java.io.IOException ex) {
++ } catch (IOException ex) {
+ ins.close();
+ // Drop through and try opening the class. But remember
+ // the exception in case we can't find the class either.
+@@ -264,8 +279,8 @@
+
+ final ClassLoader cloader = cls;
+ objectUrl = (URL)
+- java.security.AccessController.doPrivileged
+- (new java.security.PrivilegedAction() {
++ AccessController.doPrivileged
++ (new PrivilegedAction() {
+ public Object run() {
+ if (cloader == null)
+ return ClassLoader.getSystemResource
+@@ -377,10 +392,11 @@
+ * @return True if we are running in an application construction
+ * environment.
+ *
+- * @see java.beans.DesignMode
++ * @see DesignMode
+ */
+ public static boolean isDesignTime() {
+- return designTime;
++ Object value = AppContext.getAppContext().get(DESIGN_TIME);
++ return (value instanceof Boolean) && (Boolean) value;
+ }
+
+ /**
+@@ -393,11 +409,12 @@
+ * false in a server environment or if an application is
+ * running as part of a batch job.
+ *
+- * @see java.beans.Visibility
++ * @see Visibility
+ *
+ */
+ public static boolean isGuiAvailable() {
+- return guiAvailable;
++ Object value = AppContext.getAppContext().get(GUI_AVAILABLE);
++ return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless();
+ }
+
+ /**
+@@ -423,7 +440,7 @@
+ if (sm != null) {
+ sm.checkPropertiesAccess();
+ }
+- designTime = isDesignTime;
++ AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime));
+ }
+
+ /**
+@@ -449,14 +466,7 @@
+ if (sm != null) {
+ sm.checkPropertiesAccess();
+ }
+- guiAvailable = isGuiAvailable;
+- }
+-
+-
+- private static boolean designTime;
+- private static boolean guiAvailable;
+- static {
+- guiAvailable = !GraphicsEnvironment.isHeadless();
++ AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable));
+ }
+ }
+
+@@ -501,7 +511,7 @@
+
+ class BeansAppletContext implements AppletContext {
+ Applet target;
+- java.util.Hashtable imageCache = new java.util.Hashtable();
++ Hashtable imageCache = new Hashtable();
+
+ BeansAppletContext(Applet target) {
+ this.target = target;
+@@ -546,8 +556,8 @@
+ return null;
+ }
+
+- public java.util.Enumeration getApplets() {
+- java.util.Vector applets = new java.util.Vector();
++ public Enumeration getApplets() {
++ Vector applets = new Vector();
+ applets.addElement(target);
+ return applets.elements();
+ }
+@@ -573,7 +583,7 @@
+ return null;
+ }
+
+- public java.util.Iterator getStreamKeys(){
++ public Iterator getStreamKeys(){
+ // We do nothing.
+ return null;
+ }
+diff --git a/test/java/beans/Beans/6669869/TestDesignTime.java b/test/java/beans/Beans/6669869/TestDesignTime.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/beans/Beans/6669869/TestDesignTime.java
+@@ -0,0 +1,52 @@
++/*
++ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ */
++
++/*
++ * @test
++ * @bug 6669869
++ * @summary Tests DesignTime property in different application contexts
++ * @author Sergey Malenkov
++ */
++
++import java.beans.Beans;
++import sun.awt.SunToolkit;
++
++public class TestDesignTime implements Runnable {
++ public static void main(String[] args) throws InterruptedException {
++ if (Beans.isDesignTime()) {
++ throw new Error("unexpected DesignTime property");
++ }
++ Beans.setDesignTime(!Beans.isDesignTime());
++ ThreadGroup group = new ThreadGroup("$$$");
++ Thread thread = new Thread(group, new TestDesignTime());
++ thread.start();
++ thread.join();
++ }
++
++ public void run() {
++ SunToolkit.createNewAppContext();
++ if (Beans.isDesignTime()) {
++ throw new Error("shared DesignTime property");
++ }
++ }
++}
+diff --git a/test/java/beans/Beans/6669869/TestGuiAvailable.java b/test/java/beans/Beans/6669869/TestGuiAvailable.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java
+@@ -0,0 +1,53 @@
++/*
++ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ */
++
++/*
++ * @test
++ * @bug 6669869
++ * @summary Tests GuiAvailable property in different application contexts
++ * @author Sergey Malenkov
++ */
++
++import java.awt.GraphicsEnvironment;
++import java.beans.Beans;
++import sun.awt.SunToolkit;
++
++public class TestGuiAvailable implements Runnable {
++ public static void main(String[] args) throws InterruptedException {
++ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
++ throw new Error("unexpected GuiAvailable property");
++ }
++ Beans.setGuiAvailable(!Beans.isGuiAvailable());
++ ThreadGroup group = new ThreadGroup("$$$");
++ Thread thread = new Thread(group, new TestGuiAvailable());
++ thread.start();
++ thread.join();
++ }
++
++ public void run() {
++ SunToolkit.createNewAppContext();
++ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
++ throw new Error("shared GuiAvailable property");
++ }
++ }
++}
diff --git a/java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch b/java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch
new file mode 100644
index 000000000000..ac485c96d1ba
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch
@@ -0,0 +1,13847 @@
+# HG changeset patch
+# User andrew
+# Date 1365742546 -3600
+# Node ID ec8a935f0737e033e4ffd401c4d554cd73739c39
+# Parent e8ed86062291305172267be90dcec2acef7c15a8
+6886358: layout code update
+Reviewed-by: igor, prr
+
+diff --git a/make/sun/font/FILES_c.gmk b/make/sun/font/FILES_c.gmk
+--- jdk/make/sun/font/FILES_c.gmk
++++ jdk/make/sun/font/FILES_c.gmk
+@@ -72,8 +72,7 @@
+ GlyphPositioningTables.cpp \
+ GlyphSubstLookupProc.cpp \
+ GlyphSubstitutionTables.cpp \
+- HebrewLigatureData.cpp \
+- HebrewShaping.cpp \
++ HangulLayoutEngine.cpp \
+ IndicClassTables.cpp \
+ IndicReordering.cpp \
+ KernTable.cpp \
+@@ -99,6 +98,8 @@
+ SubstitutionLookups.cpp \
+ ThaiShaping.cpp \
+ ThaiStateTables.cpp \
++ TibetanLayoutEngine.cpp \
++ TibetanReordering.cpp \
+ ValueRecords.cpp \
+ ArabicLayoutEngine.cpp \
+ ArabicShaping.cpp \
+diff --git a/src/share/classes/sun/font/FontManager.java b/src/share/classes/sun/font/FontManager.java
+--- jdk/src/share/classes/sun/font/FontManager.java
++++ jdk/src/share/classes/sun/font/FontManager.java
+@@ -3598,6 +3598,18 @@
+ // 0E00 - 0E7F if Thai, assume shaping for vowel, tone marks
+ return true;
+ }
++ else if (code < 0x0f00) {
++ return false;
++ }
++ else if (code <= 0x0fff) { // U+0F00 - U+0FFF Tibetan
++ return true;
++ }
++ else if (code < 0x1100) {
++ return false;
++ }
++ else if (code < 0x11ff) { // U+1100 - U+11FF Old Hangul
++ return true;
++ }
+ else if (code < 0x1780) {
+ return false;
+ }
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+@@ -59,16 +59,16 @@
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine)
+
+ ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+ }
+
+ ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
++ le_int32 typoFlags, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success)
+ {
+ fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount);
+
+@@ -151,8 +151,8 @@
+ }
+ }
+
+-UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG)
++UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
++ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success)
+ {
+ fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
+ fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.h b/src/share/native/sun/font/layout/ArabicLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h
+@@ -66,6 +66,7 @@
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
+ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LayoutEngine::layoutEngineFactory
+ * @see OpenTypeLayoutEngine
+@@ -74,7 +75,7 @@
+ * @internal
+ */
+ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -83,6 +84,7 @@
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
++ * @param success - set to an error code if the operation fails
+ *
+ * @see OpenTypeLayoutEngine
+ * @see ScriptAndLanguageTags.h for script and language codes
+@@ -90,7 +92,7 @@
+ * @internal
+ */
+ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags);
++ le_int32 typoFlags, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -184,6 +186,7 @@
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+ * @param languageCode - the language
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LEFontInstance
+ * @see ScriptAndLanguageTags.h for script and language codes
+@@ -191,7 +194,7 @@
+ * @internal
+ */
+ UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags);
++ le_int32 typoFlags, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+diff --git a/src/share/native/sun/font/layout/ArabicShaping.cpp b/src/share/native/sun/font/layout/ArabicShaping.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicShaping.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicShaping.cpp
+@@ -104,6 +104,7 @@
+ #define markFeatureMask 0x00040000UL
+ #define mkmkFeatureMask 0x00020000UL
+
++#define NO_FEATURES 0
+ #define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask)
+
+ #define SHAPE_MASK 0xF0000000UL
+@@ -198,7 +199,11 @@
+ LEUnicode c = chars[in];
+ ShapeType t = getShapeType(c);
+
++ if (t == ST_NOSHAPE_NONE) {
++ glyphStorage.setAuxData(out, NO_FEATURES, success);
++ } else {
+ glyphStorage.setAuxData(out, ISOL_FEATURES, success);
++ }
+
+ if ((t & MASK_TRANSPARENT) != 0) {
+ continue;
+diff --git a/src/share/native/sun/font/layout/CanonData.cpp b/src/share/native/sun/font/layout/CanonData.cpp
+--- jdk/src/share/native/sun/font/layout/CanonData.cpp
++++ jdk/src/share/native/sun/font/layout/CanonData.cpp
+@@ -30,7 +30,7 @@
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
+ *
+- * Generated on: 03/31/2005 08:15:27 AM HST
++ * Generated on: 03/12/2008 03:14:34 PM HST
+ */
+
+ #include "LETypes.h"
+@@ -39,36 +39,33 @@
+ U_NAMESPACE_BEGIN
+
+ const le_uint8 CanonShaping::glyphSubstitutionTable[] = {
+- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x58, 0x02, 0x86, 0x00, 0x12, 0x61, 0x72, 0x61, 0x62,
+- 0x00, 0x6E, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65,
+- 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6, 0x67, 0x75, 0x72, 0x75, 0x00, 0xB2,
+- 0x68, 0x65, 0x62, 0x72, 0x00, 0xBE, 0x68, 0x69, 0x72, 0x61, 0x00, 0xCA, 0x6B, 0x61, 0x6E, 0x61,
+- 0x00, 0xD6, 0x6B, 0x6E, 0x64, 0x61, 0x00, 0xE2, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xEE, 0x6D, 0x6C,
+- 0x79, 0x6D, 0x00, 0xFA, 0x6D, 0x79, 0x6D, 0x72, 0x01, 0x06, 0x6F, 0x72, 0x79, 0x61, 0x01, 0x12,
+- 0x73, 0x69, 0x6E, 0x68, 0x01, 0x1E, 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x2A, 0x74, 0x65, 0x6C, 0x75,
+- 0x01, 0x36, 0x74, 0x69, 0x62, 0x74, 0x01, 0x42, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+- 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x00, 0x15, 0x00, 0x12, 0x00, 0x14, 0x00, 0x04, 0x00, 0x00,
++ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x34, 0x02, 0x46, 0x00, 0x10, 0x61, 0x72, 0x61, 0x62,
++ 0x00, 0x62, 0x62, 0x61, 0x6C, 0x69, 0x00, 0x76, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79,
++ 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6,
++ 0x68, 0x69, 0x72, 0x61, 0x00, 0xB2, 0x6B, 0x61, 0x6E, 0x61, 0x00, 0xBE, 0x6B, 0x6E, 0x64, 0x61,
++ 0x00, 0xCA, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xD6, 0x6D, 0x6C, 0x79, 0x6D, 0x00, 0xE2, 0x6D, 0x79,
++ 0x6D, 0x72, 0x00, 0xEE, 0x6F, 0x72, 0x79, 0x61, 0x00, 0xFA, 0x73, 0x69, 0x6E, 0x68, 0x01, 0x06,
++ 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x12, 0x74, 0x65, 0x6C, 0x75, 0x01, 0x1E, 0x00, 0x04, 0x00, 0x00,
++ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x00, 0x13, 0x00, 0x10, 0x00, 0x12,
++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x03,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+- 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x07,
+- 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00,
+- 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
++ 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x06,
++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
++ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0x00, 0x01, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0B,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+- 0x00, 0x01, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F,
+- 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00,
+- 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x11, 0x00, 0x16, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x86,
+- 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8E, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x96, 0x63, 0x63, 0x6D, 0x70,
+- 0x00, 0x9E, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAE, 0x63, 0x63,
+- 0x6D, 0x70, 0x00, 0xB6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xC6,
+- 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD6, 0x63, 0x63, 0x6D, 0x70,
+- 0x00, 0xDE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEE, 0x63, 0x63,
+- 0x6D, 0x70, 0x00, 0xF6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xFE, 0x63, 0x63, 0x6D, 0x70, 0x01, 0x06,
+- 0x63, 0x63, 0x6D, 0x70, 0x01, 0x0E, 0x66, 0x69, 0x6E, 0x61, 0x01, 0x16, 0x69, 0x6E, 0x69, 0x74,
+- 0x01, 0x1C, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x22, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x28, 0x00, 0x00,
++ 0x00, 0x01, 0x00, 0x0E, 0x00, 0x14, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x7A, 0x63, 0x63, 0x6D, 0x70,
++ 0x00, 0x82, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x92, 0x63, 0x63,
++ 0x6D, 0x70, 0x00, 0x9A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAA,
++ 0x63, 0x63, 0x6D, 0x70, 0x00, 0xB2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBA, 0x63, 0x63, 0x6D, 0x70,
++ 0x00, 0xC2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD2, 0x63, 0x63,
++ 0x6D, 0x70, 0x00, 0xDA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEA,
++ 0x63, 0x63, 0x6D, 0x70, 0x00, 0xF2, 0x66, 0x69, 0x6E, 0x61, 0x00, 0xFA, 0x69, 0x6E, 0x69, 0x74,
++ 0x01, 0x00, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x06, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x0C, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x00,
+@@ -77,355 +74,349 @@
+ 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00,
+- 0x00, 0x02, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x27, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05,
+- 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x28, 0x00, 0x52, 0x00, 0xC8, 0x01, 0x2A, 0x01, 0xF4,
+- 0x02, 0xBE, 0x03, 0xF8, 0x15, 0x06, 0x15, 0x58, 0x15, 0x9C, 0x18, 0x4E, 0x1A, 0xC4, 0x1B, 0x70,
+- 0x1B, 0xF0, 0x4F, 0xEA, 0x8E, 0xAE, 0x8F, 0x14, 0x8F, 0x62, 0x91, 0x58, 0x93, 0x26, 0x94, 0x94,
+- 0x95, 0xB4, 0x96, 0x0A, 0x96, 0x66, 0x98, 0x0C, 0x99, 0x54, 0xB9, 0x0C, 0xDC, 0x92, 0xDC, 0xC8,
+- 0xDC, 0xF8, 0xDD, 0x18, 0xDD, 0x34, 0xDD, 0x80, 0xDD, 0xC4, 0xDE, 0x0C, 0xDE, 0x5E, 0xDE, 0xA2,
+- 0xDE, 0xDC, 0xDE, 0xFC, 0xDF, 0x18, 0xE0, 0x36, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
+- 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A,
+- 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53,
+- 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25, 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04,
+- 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54,
+- 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3,
+- 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01,
+- 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A, 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02,
+- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C,
+- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27,
+- 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54, 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02,
+- 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A, 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54,
+- 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02, 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08,
+- 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3,
+- 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B,
+- 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7,
+- 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7,
+- 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68,
+- 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C,
+- 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98,
+- 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26,
+- 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34,
+- 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42,
+- 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79,
+- 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86,
+- 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3,
+- 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C,
+- 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4,
+- 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4,
+- 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59,
+- 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71,
+- 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9,
+- 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B,
+- 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37,
+- 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45,
+- 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E,
+- 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6,
+- 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1,
+- 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A,
+- 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90,
+- 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC,
+- 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6,
+- 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6,
+- 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53,
+- 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89,
+- 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F,
+- 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5,
+- 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD,
+- 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24,
+- 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C,
+- 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34,
+- 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42,
+- 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A,
+- 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83,
+- 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91,
+- 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3,
+- 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7,
+- 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A,
+- 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2, 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A,
+- 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A, 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38,
+- 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C, 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56,
+- 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66, 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E,
+- 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2, 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A,
+- 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50, 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6,
+- 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74,
+- 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A,
+- 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A,
+- 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02,
+- 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6,
+- 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E,
+- 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02,
+- 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02,
+- 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC,
+- 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E,
+- 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E,
+- 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3,
+- 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5,
+- 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02,
+- 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67,
+- 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE,
+- 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08,
+- 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB,
+- 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01,
+- 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24,
+- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54,
+- 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02,
+- 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E,
+- 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38,
+- 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2,
+- 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B,
+- 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02,
+- 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34,
+- 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A,
+- 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B,
+- 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02,
+- 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0,
+- 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D,
+- 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02,
+- 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0,
+- 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8,
+- 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02,
+- 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30,
+- 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A,
+- 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0,
+- 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E,
+- 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2,
+- 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02,
+- 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4,
+- 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2,
+- 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02,
+- 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13,
+- 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18,
+- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02,
+- 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5,
+- 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC,
+- 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12,
+- 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15,
+- 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE,
+- 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02,
+- 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10,
+- 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03,
+- 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03,
+- 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03,
+- 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2,
+- 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17,
+- 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2,
+- 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF,
+- 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E,
+- 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A,
+- 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06,
+- 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01,
+- 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18,
+- 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC, 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD,
+- 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A,
+- 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E,
+- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C,
+- 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02,
+- 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0,
+- 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02,
+- 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02,
+- 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D,
+- 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C,
+- 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0,
+- 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8,
+- 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36,
+- 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40,
+- 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74,
+- 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A,
+- 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02,
+- 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D,
+- 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46,
+- 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C,
+- 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03,
+- 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2,
+- 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2,
+- 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02,
+- 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9,
+- 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0,
+- 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32,
+- 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C,
+- 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4,
+- 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F,
+- 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04,
+- 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20,
+- 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4,
+- 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03,
+- 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06,
+- 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C,
+- 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4,
+- 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2,
+- 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A,
+- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C,
+- 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02,
+- 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24,
+- 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02,
+- 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7,
+- 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2,
+- 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E,
+- 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F,
+- 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02,
+- 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
+- 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2,
+- 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03,
+- 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02,
+- 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05,
+- 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06,
+- 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01,
+- 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22,
+- 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02,
+- 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0,
+- 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2,
+- 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7,
+- 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16,
+- 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2,
+- 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0,
+- 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14,
+- 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26,
+- 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C,
+- 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0,
+- 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24,
+- 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0,
+- 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A,
+- 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D,
+- 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2,
+- 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03,
+- 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2,
+- 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03,
+- 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02,
+- 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
+- 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2,
+- 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34,
+- 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02,
+- 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05,
+- 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E,
+- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48,
+- 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02,
+- 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39,
+- 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6,
+- 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02,
+- 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4,
+- 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02,
+- 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34,
+- 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02,
+- 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC,
+- 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2,
+- 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50,
+- 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86,
+- 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82,
+- 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02,
+- 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0,
+- 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40,
+- 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02,
+- 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4,
+- 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03,
+- 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC,
+- 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24,
+- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C,
+- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96,
+- 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02,
+- 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E,
+- 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2,
+- 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0,
+- 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2,
+- 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02,
+- 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34,
+- 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70,
+- 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45,
+- 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03,
+- 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02,
+- 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0,
+- 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4,
+- 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E,
+- 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0,
+- 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4,
+- 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E,
+- 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E,
+- 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2,
+- 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1,
+- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34,
+- 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66,
+- 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0,
+- 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0,
+- 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3,
+- 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8,
+- 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02,
+- 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10,
+- 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58,
+- 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C,
+- 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2,
+- 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2,
+- 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2,
+- 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02,
+- 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4,
+- 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF,
+- 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2,
+- 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C,
+- 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E,
+- 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03,
+- 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02,
+- 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01,
+- 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04,
+- 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70,
+- 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E,
+- 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E,
+- 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02,
+- 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58,
+- 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02,
+- 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A,
+- 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36,
+- 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF,
+- 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91,
+- 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2,
+- 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2,
+- 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02,
+- 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01,
+- 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C, 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92,
+- 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4,
+- 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8,
+- 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8,
+- 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8,
+- 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8,
+- 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00,
+- 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x22,
+- 0x00, 0x2C, 0x00, 0x01, 0x00, 0x04, 0x09, 0xDC, 0x00, 0x02, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x04,
+- 0x09, 0xDD, 0x00, 0x02, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x04, 0x09, 0xDF, 0x00, 0x02, 0x09, 0xBC,
+- 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE, 0x09, 0xCC, 0x00, 0x02,
+- 0x09, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x09, 0xA1, 0x09, 0xA2, 0x09, 0xAF, 0x09, 0xC7, 0x00, 0x02,
+- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16,
+- 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7,
+- 0x09, 0xD7, 0x00, 0x02, 0x09, 0xA1, 0x09, 0xBC, 0x00, 0x02, 0x09, 0xA2, 0x09, 0xBC, 0x00, 0x02,
+- 0x09, 0xAF, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x05, 0x09, 0xCB, 0x09, 0xCC, 0x09, 0xDC, 0x09, 0xDD,
+- 0x09, 0xDF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20,
++ 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x24, 0x00, 0x4A, 0x00, 0xC0, 0x01, 0x22, 0x01, 0xEC,
++ 0x02, 0xB6, 0x03, 0xF0, 0x14, 0xFE, 0x15, 0x26, 0x15, 0x4C, 0x17, 0xFE, 0x1A, 0x74, 0x1A, 0xB0,
++ 0x1A, 0xE0, 0x4E, 0xDA, 0x8B, 0xBC, 0x8D, 0x2A, 0x8E, 0x4A, 0x8E, 0xA0, 0x8E, 0xFC, 0x90, 0xA2,
++ 0x91, 0xEA, 0xB1, 0xA2, 0xD5, 0x1E, 0xD5, 0x54, 0xD5, 0x84, 0xD5, 0xA4, 0xD5, 0xC0, 0xD5, 0xF0,
++ 0xD6, 0x20, 0xD6, 0x68, 0xD6, 0xBA, 0xD6, 0xFE, 0xD7, 0x38, 0xD7, 0x58, 0xD7, 0x74, 0xD8, 0x20,
++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12,
++ 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E,
++ 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53, 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25,
++ 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04, 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01,
++ 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02,
++ 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04,
++ 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A,
++ 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34,
++ 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27, 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54,
++ 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02, 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A,
++ 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54, 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02,
++ 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25,
++ 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
++ 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F,
++ 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7,
++ 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7,
++ 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64,
++ 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90,
++ 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE,
++ 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C,
++ 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38,
++ 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46,
++ 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F,
++ 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9,
++ 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC,
++ 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E,
++ 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4,
++ 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4,
++ 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4,
++ 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75,
++ 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D,
++ 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E,
++ 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33,
++ 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41,
++ 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A,
++ 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84,
++ 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1,
++ 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00,
++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86,
++ 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E,
++ 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6,
++ 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6,
++ 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2,
++ 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77,
++ 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D,
++ 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97,
++ 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8,
++ 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01,
++ 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28,
++ 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30,
++ 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38,
++ 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46,
++ 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B,
++ 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88,
++ 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9,
++ 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0,
++ 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC,
++ 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A, 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2,
++ 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A, 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A,
++ 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38, 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C,
++ 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56, 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66,
++ 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E, 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2,
++ 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A, 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50,
++ 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6, 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01,
++ 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32,
++ 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62,
++ 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC,
++ 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA,
++ 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02,
++ 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97,
++ 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4,
++ 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02,
++ 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26,
++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56,
++ 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01,
++ 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02,
++ 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64,
++ 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2,
++ 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02,
++ 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02,
++ 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04,
++ 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B,
++ 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C,
++ 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C,
++ 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4,
++ 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02,
++ 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E,
++ 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50,
++ 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2,
++ 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02,
++ 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2,
++ 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2,
++ 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50,
++ 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88,
++ 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03,
++ 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2,
++ 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4,
++ 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03,
++ 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2,
++ 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4,
++ 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5,
++ 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2,
++ 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E,
++ 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82,
++ 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2,
++ 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0,
++ 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71,
++ 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4,
++ 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02,
++ 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18,
++ 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2,
++ 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02,
++ 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
++ 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0,
++ 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02,
++ 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36,
++ 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02,
++ 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E,
++ 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30,
++ 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03,
++ 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03,
++ 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02,
++ 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A,
++ 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02,
++ 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14,
++ 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B,
++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16,
++ 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E,
++ 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02,
++ 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70,
++ 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC,
++ 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD, 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE,
++ 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46,
++ 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C,
++ 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03,
++ 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2,
++ 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E,
++ 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE,
++ 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60,
++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0,
++ 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
++ 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68,
++ 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0,
++ 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6,
++ 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02,
++ 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26,
++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58,
++ 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E,
++ 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03,
++ 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6,
++ 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02,
++ 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A,
++ 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60,
++ 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25,
++ 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02,
++ 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2,
++ 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27,
++ 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE,
++ 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C,
++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02,
++ 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E,
++ 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50,
++ 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02,
++ 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4,
++ 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03,
++ 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA,
++ 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20, 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA,
++ 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3,
++ 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03, 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02,
++ 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4,
++ 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E,
++ 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4,
++ 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE,
++ 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32,
++ 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22,
++ 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2,
++ 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03,
++ 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE,
++ 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02,
++ 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E,
++ 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB,
++ 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C,
++ 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2,
++ 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A,
++ 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27,
++ 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03,
++ 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22,
++ 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2,
++ 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4,
++ 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40,
++ 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0,
++ 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4,
++ 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4,
++ 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02,
++ 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34,
++ 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2,
++ 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2,
++ 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E,
++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E,
++ 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02,
++ 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05,
++ 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B,
++ 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44,
++ 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02,
++ 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F,
++ 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02,
++ 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12,
++ 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03,
++ 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2,
++ 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A,
++ 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1,
++ 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03,
++ 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24,
++ 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
++ 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62,
++ 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E,
++ 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02,
++ 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B,
++ 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2,
++ 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D,
++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A,
++ 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80,
++ 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0,
++ 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7,
++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02,
++ 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36,
++ 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C,
++ 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0,
++ 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9,
++ 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E,
++ 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0, 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4,
++ 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03,
++ 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6,
++ 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42,
++ 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02,
++ 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C,
++ 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A,
++ 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8,
++ 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E,
++ 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E, 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2,
++ 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2,
++ 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2,
++ 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87,
++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED,
++ 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2,
++ 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50,
++ 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C,
++ 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03,
++ 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03,
++ 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2,
++ 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4,
++ 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4,
++ 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F,
++ 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02,
++ 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A,
++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C,
++ 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2,
++ 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2,
++ 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E,
++ 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E,
++ 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02,
++ 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0,
++ 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95,
++ 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02,
++ 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5,
++ 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A,
++ 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74,
++ 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2,
++ 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0,
++ 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0,
++ 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B,
++ 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4,
++ 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4,
++ 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02,
++ 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20,
++ 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02,
++ 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52,
++ 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03,
++ 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3,
++ 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01,
++ 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26,
++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58,
++ 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56,
++ 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6,
++ 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03,
++ 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC,
++ 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A,
++ 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52,
++ 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE,
++ 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02,
++ 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2,
++ 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94,
++ 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0,
++ 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C,
++ 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C,
++ 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD,
++ 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0,
++ 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0,
++ 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0,
++ 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0,
++ 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1A,
++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE,
++ 0x09, 0xCC, 0x00, 0x02, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x01, 0x09, 0xC7, 0x00, 0x02, 0x00, 0x00,
++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02,
++ 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x02, 0x09, 0xCB,
++ 0x09, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20,
+ 0x00, 0x46, 0x00, 0x50, 0x00, 0x62, 0x00, 0x74, 0x00, 0x96, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xDC,
+ 0x00, 0xEE, 0x00, 0xF8, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x4A, 0x01, 0x5C,
+ 0x01, 0x7E, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xC4, 0x01, 0xD6, 0x01, 0xE0, 0x02, 0x02, 0x02, 0x0C,
+@@ -508,25 +499,13 @@
+ 0x04, 0x35, 0x03, 0x40, 0x00, 0x02, 0x04, 0x33, 0x03, 0x41, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x41,
+ 0x00, 0x02, 0x04, 0x38, 0x03, 0x40, 0x00, 0x01, 0x00, 0x08, 0x04, 0x00, 0x04, 0x03, 0x04, 0x0C,
+ 0x04, 0x0D, 0x04, 0x50, 0x04, 0x53, 0x04, 0x5C, 0x04, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A,
+- 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01,
+- 0x00, 0x04, 0x09, 0x58, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x59, 0x00, 0x02,
+- 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5A, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04,
+- 0x09, 0x5B, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5C, 0x00, 0x02, 0x09, 0x3C,
+- 0x00, 0x01, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x29,
+- 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5E, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01,
+- 0x00, 0x04, 0x09, 0x5F, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02,
+- 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x0B,
+- 0x09, 0x15, 0x09, 0x16, 0x09, 0x17, 0x09, 0x1C, 0x09, 0x21, 0x09, 0x22, 0x09, 0x28, 0x09, 0x2B,
+- 0x09, 0x2F, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
+- 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A,
+- 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C,
+- 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x15,
+- 0x09, 0x3C, 0x00, 0x02, 0x09, 0x16, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x17, 0x09, 0x3C, 0x00, 0x02,
+- 0x09, 0x1C, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x21, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x22, 0x09, 0x3C,
+- 0x00, 0x02, 0x09, 0x2B, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x2F, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x0B,
+- 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x09, 0x58, 0x09, 0x59, 0x09, 0x5A, 0x09, 0x5B, 0x09, 0x5C,
+- 0x09, 0x5D, 0x09, 0x5E, 0x09, 0x5F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01,
++ 0x00, 0x04, 0x09, 0x29, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02,
++ 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03,
++ 0x09, 0x28, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C,
++ 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03,
++ 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
+ 0x33, 0x04, 0x00, 0x75, 0x00, 0xF0, 0x01, 0x1A, 0x04, 0x5A, 0x05, 0x0C, 0x08, 0x3C, 0x09, 0x24,
+ 0x09, 0xD6, 0x09, 0xE0, 0x0A, 0x54, 0x0D, 0x84, 0x0D, 0x8E, 0x0D, 0x98, 0x11, 0x44, 0x11, 0xF6,
+ 0x15, 0x92, 0x16, 0xBC, 0x17, 0x6E, 0x17, 0x88, 0x18, 0xB2, 0x1C, 0x4E, 0x1C, 0x78, 0x1C, 0xA2,
+@@ -1358,569 +1337,541 @@
+ 0x1F, 0x81, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0xA0,
+ 0x1F, 0xA1, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xB3, 0x1F, 0xB6, 0x1F, 0xBC, 0x1F, 0xBE, 0x1F, 0xBF,
+ 0x1F, 0xC3, 0x1F, 0xC6, 0x1F, 0xCC, 0x1F, 0xF3, 0x1F, 0xF6, 0x1F, 0xFC, 0x1F, 0xFE, 0x21, 0x26,
+- 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x0A, 0x10, 0x12, 0x6E, 0x18, 0x84, 0x1E, 0x68,
+- 0x22, 0x7A, 0x26, 0x68, 0x29, 0x12, 0x2B, 0x5C, 0x2D, 0x24, 0x2F, 0x04, 0x30, 0xB4, 0x32, 0x62,
+- 0x33, 0xCA, 0x35, 0x32, 0x36, 0x9A, 0x37, 0x76, 0x38, 0x52, 0x39, 0x2E, 0x39, 0xFC, 0x3A, 0xCA,
+- 0x3B, 0x98, 0x3C, 0x4A, 0x3C, 0xFC, 0x3D, 0x22, 0x3D, 0x48, 0x3D, 0x6E, 0x3D, 0x94, 0x3D, 0xBA,
+- 0x3D, 0xE0, 0x3E, 0x06, 0x3E, 0x2C, 0x3E, 0x52, 0x3E, 0x78, 0x3E, 0x9E, 0x00, 0x01, 0x07, 0xCE,
+- 0x00, 0xF9, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1C,
+- 0x02, 0x22, 0x02, 0x28, 0x02, 0x2E, 0x02, 0x34, 0x02, 0x3A, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C,
+- 0x02, 0x52, 0x02, 0x58, 0x02, 0x5E, 0x02, 0x64, 0x02, 0x6A, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7C,
+- 0x02, 0x82, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC,
+- 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC,
+- 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xEE, 0x02, 0xF4, 0x02, 0xFA, 0x03, 0x00, 0x03, 0x06, 0x03, 0x0C,
+- 0x03, 0x12, 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C,
+- 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C,
+- 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84, 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C,
+- 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBA, 0x03, 0xC0, 0x03, 0xC6, 0x03, 0xCC,
+- 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF0, 0x03, 0xF6, 0x03, 0xFC,
+- 0x04, 0x02, 0x04, 0x08, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C,
+- 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x4A, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5C,
+- 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, 0x04, 0x86, 0x04, 0x8C,
+- 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB6, 0x04, 0xBC,
+- 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, 0x04, 0xEC,
+- 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, 0x05, 0x16, 0x05, 0x1C,
+- 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, 0x05, 0x46, 0x05, 0x4C,
+- 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, 0x05, 0x76, 0x05, 0x7C,
+- 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, 0x05, 0xA6, 0x05, 0xAC,
+- 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, 0x05, 0xD6, 0x05, 0xDC,
+- 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, 0x06, 0x06, 0x06, 0x0C,
+- 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, 0x06, 0x36, 0x06, 0x3C,
+- 0x06, 0x42, 0x06, 0x48, 0x06, 0x4E, 0x06, 0x54, 0x06, 0x5A, 0x06, 0x60, 0x06, 0x66, 0x06, 0x6C,
+- 0x06, 0x72, 0x06, 0x78, 0x06, 0x7E, 0x06, 0x84, 0x06, 0x8A, 0x06, 0x90, 0x06, 0x96, 0x06, 0x9C,
+- 0x06, 0xA2, 0x06, 0xA8, 0x06, 0xAE, 0x06, 0xB4, 0x06, 0xBA, 0x06, 0xC0, 0x06, 0xC6, 0x06, 0xCC,
+- 0x06, 0xD2, 0x06, 0xD8, 0x06, 0xDE, 0x06, 0xE4, 0x06, 0xEA, 0x06, 0xF0, 0x06, 0xF6, 0x06, 0xFC,
+- 0x07, 0x02, 0x07, 0x08, 0x07, 0x0E, 0x07, 0x14, 0x07, 0x1A, 0x07, 0x20, 0x07, 0x26, 0x07, 0x2C,
+- 0x07, 0x32, 0x07, 0x38, 0x07, 0x3E, 0x07, 0x44, 0x07, 0x4A, 0x07, 0x50, 0x07, 0x56, 0x07, 0x5C,
+- 0x07, 0x62, 0x07, 0x68, 0x07, 0x6E, 0x07, 0x74, 0x07, 0x7A, 0x07, 0x80, 0x07, 0x86, 0x07, 0x8C,
+- 0x07, 0x92, 0x07, 0x98, 0x07, 0x9E, 0x07, 0xA4, 0x07, 0xAA, 0x07, 0xB0, 0x07, 0xB6, 0x07, 0xBC,
+- 0x07, 0xC2, 0x07, 0xC8, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01,
+- 0x00, 0x02, 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08,
+- 0x00, 0x02, 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0xC5, 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08,
+- 0x00, 0x02, 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02,
+- 0x03, 0xB1, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00,
+- 0x00, 0x02, 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02,
+- 0x03, 0x91, 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00,
+- 0x00, 0x02, 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02,
+- 0x03, 0xB5, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00,
+- 0x00, 0x02, 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02,
+- 0x1F, 0x18, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01,
+- 0x00, 0x02, 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x20, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x28, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x30, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x38, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x40, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13,
+- 0x00, 0x02, 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49,
+- 0x03, 0x00, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0xC5, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00,
+- 0x00, 0x02, 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02,
+- 0x03, 0xA5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01,
+- 0x00, 0x02, 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x60, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9,
+- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x68, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB1,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00,
+- 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x03,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0B,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x23,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2B,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x63,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6B,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x06,
+- 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1,
+- 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02, 0x03, 0x91, 0x03, 0x04,
+- 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91,
+- 0x03, 0x45, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02,
+- 0x03, 0xB7, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42,
+- 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x95,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x01,
+- 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB9,
+- 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02,
+- 0x03, 0xB9, 0x03, 0x42, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06,
+- 0x00, 0x02, 0x03, 0x99, 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x03, 0x99,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02,
+- 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04,
+- 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x44, 0x00, 0x02, 0x03, 0xC1,
++ 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x09, 0x66, 0x11, 0x1A, 0x17, 0x08, 0x1C, 0xC2,
++ 0x20, 0xBC, 0x24, 0x9E, 0x27, 0x3C, 0x29, 0x7A, 0x2B, 0x42, 0x2D, 0x22, 0x2E, 0xD2, 0x30, 0x80,
++ 0x31, 0xE8, 0x33, 0x50, 0x34, 0xB8, 0x35, 0x94, 0x36, 0x70, 0x37, 0x4C, 0x38, 0x1A, 0x38, 0xE8,
++ 0x39, 0xB6, 0x3A, 0x68, 0x3B, 0x1A, 0x3B, 0x40, 0x3B, 0x66, 0x3B, 0x8C, 0x3B, 0xB2, 0x3B, 0xD8,
++ 0x3B, 0xFE, 0x3C, 0x24, 0x3C, 0x4A, 0x3C, 0x70, 0x3C, 0x96, 0x3C, 0xBC, 0x00, 0x01, 0x07, 0x46,
++ 0x00, 0xE8, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA,
++ 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A,
++ 0x02, 0x30, 0x02, 0x36, 0x02, 0x3C, 0x02, 0x42, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54, 0x02, 0x5A,
++ 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8A,
++ 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB4, 0x02, 0xBA,
++ 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD2, 0x02, 0xD8, 0x02, 0xDE, 0x02, 0xE4, 0x02, 0xEA,
++ 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFC, 0x03, 0x02, 0x03, 0x08, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A,
++ 0x03, 0x20, 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x44, 0x03, 0x4A,
++ 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x6E, 0x03, 0x74, 0x03, 0x7A,
++ 0x03, 0x80, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA,
++ 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDA,
++ 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A,
++ 0x04, 0x10, 0x04, 0x16, 0x04, 0x1C, 0x04, 0x22, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A,
++ 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A,
++ 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A,
++ 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA,
++ 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA,
++ 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A,
++ 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A,
++ 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A,
++ 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA,
++ 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, 0x05, 0xD8, 0x05, 0xDE, 0x05, 0xE4, 0x05, 0xEA,
++ 0x05, 0xF0, 0x05, 0xF6, 0x05, 0xFC, 0x06, 0x02, 0x06, 0x08, 0x06, 0x0E, 0x06, 0x14, 0x06, 0x1A,
++ 0x06, 0x20, 0x06, 0x26, 0x06, 0x2C, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A,
++ 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68, 0x06, 0x6E, 0x06, 0x74, 0x06, 0x7A,
++ 0x06, 0x80, 0x06, 0x86, 0x06, 0x8C, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9E, 0x06, 0xA4, 0x06, 0xAA,
++ 0x06, 0xB0, 0x06, 0xB6, 0x06, 0xBC, 0x06, 0xC2, 0x06, 0xC8, 0x06, 0xCE, 0x06, 0xD4, 0x06, 0xDA,
++ 0x06, 0xE0, 0x06, 0xE6, 0x06, 0xEC, 0x06, 0xF2, 0x06, 0xF8, 0x06, 0xFE, 0x07, 0x04, 0x07, 0x0A,
++ 0x07, 0x10, 0x07, 0x16, 0x07, 0x1C, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2E, 0x07, 0x34, 0x07, 0x3A,
++ 0x07, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02,
++ 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99, 0x03, 0x01,
++ 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9,
++ 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08, 0x00, 0x02,
++ 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01,
++ 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5,
++ 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08, 0x00, 0x02,
++ 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01,
++ 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1,
++ 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00, 0x00, 0x02,
++ 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x01,
++ 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91,
++ 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00, 0x00, 0x02,
++ 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x01,
++ 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5,
++ 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00, 0x00, 0x02,
++ 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x01,
++ 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x18,
++ 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01, 0x00, 0x02,
++ 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x20,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x28,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x30,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x38,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x40,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13, 0x00, 0x02,
++ 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5,
++ 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00, 0x00, 0x02,
++ 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x01,
++ 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5,
++ 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01, 0x00, 0x02,
++ 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x60,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x14,
++ 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x68,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00,
++ 0x00, 0x02, 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF,
++ 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02,
++ 0x1F, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x03, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0x08, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x0B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0x20, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x23, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0x28, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x2B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0x60, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x63, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0x68, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x6B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02,
++ 0x03, 0xB1, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45,
++ 0x00, 0x02, 0x03, 0xB1, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1,
++ 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02,
++ 0x03, 0x91, 0x03, 0x04, 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x45,
++ 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7,
++ 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00,
++ 0x00, 0x02, 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02,
++ 0x03, 0xB9, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x42,
++ 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06, 0x00, 0x02, 0x03, 0x99,
++ 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02,
++ 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06,
++ 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC1,
+ 0x03, 0x13, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x14, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x42, 0x00, 0x02,
+ 0x03, 0xCB, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x04,
+- 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA1,
+- 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02,
+- 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02, 0x03, 0xCE, 0x03, 0x45,
+- 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x9F,
+- 0x03, 0x00, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02,
+- 0x03, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x45, 0x00, 0x01, 0x00, 0xF9, 0x03, 0x85,
+- 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90,
+- 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD, 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA,
+- 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01,
+- 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09,
+- 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11,
+- 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B,
+- 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25,
+- 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D,
+- 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35,
+- 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39, 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D,
+- 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45,
+- 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51,
+- 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B,
+- 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65,
+- 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D,
+- 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x72, 0x1F, 0x73, 0x1F, 0x74, 0x1F, 0x75,
+- 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x78, 0x1F, 0x79, 0x1F, 0x7A, 0x1F, 0x7B, 0x1F, 0x7C, 0x1F, 0x7D,
+- 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87,
+- 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F,
+- 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97,
+- 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F,
+- 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7,
+- 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF,
+- 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2, 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8,
+- 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, 0xBC, 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4,
+- 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, 0xCC, 0x1F, 0xCD,
+- 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xD6, 0x1F, 0xD7,
+- 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0,
+- 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8,
+- 0x1F, 0xE9, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xF2, 0x1F, 0xF3,
+- 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, 0xFC,
+- 0x00, 0x01, 0x06, 0xB8, 0x00, 0xD1, 0x01, 0xA8, 0x01, 0xAE, 0x01, 0xB4, 0x01, 0xBA, 0x01, 0xC0,
+- 0x01, 0xC6, 0x01, 0xCC, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xDE, 0x01, 0xE4, 0x01, 0xEA, 0x01, 0xF0,
+- 0x01, 0xF6, 0x01, 0xFC, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0E, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x20,
+- 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x40, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54,
+- 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7C, 0x02, 0x82, 0x02, 0x88,
+- 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8,
+- 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD8, 0x02, 0xE0, 0x02, 0xE6, 0x02, 0xEC,
+- 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A, 0x03, 0x20,
+- 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x3A, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54,
+- 0x03, 0x5A, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70, 0x03, 0x76, 0x03, 0x7C, 0x03, 0x82, 0x03, 0x88,
+- 0x03, 0x8E, 0x03, 0x94, 0x03, 0x9A, 0x03, 0xA0, 0x03, 0xA6, 0x03, 0xAC, 0x03, 0xB2, 0x03, 0xB8,
+- 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCA, 0x03, 0xD2, 0x03, 0xDA, 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEE,
+- 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x14, 0x04, 0x1C, 0x04, 0x22,
+- 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x56,
+- 0x04, 0x5C, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, 0x04, 0x86,
+- 0x04, 0x8C, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB6,
+- 0x04, 0xBC, 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6,
+- 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, 0x05, 0x16,
+- 0x05, 0x1C, 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, 0x05, 0x46,
+- 0x05, 0x4C, 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, 0x05, 0x76,
+- 0x05, 0x7C, 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, 0x05, 0xA6,
+- 0x05, 0xAC, 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, 0x05, 0xD6,
+- 0x05, 0xDC, 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, 0x06, 0x06,
+- 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, 0x06, 0x36,
+- 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A, 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68,
+- 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C, 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A,
+- 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC, 0x06, 0xB2, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x41, 0x00, 0x02,
+- 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02, 0x03, 0x97, 0x03, 0x41,
+- 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA5,
+- 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x01, 0x00, 0x02,
+- 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x41,
+- 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBE,
+- 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x41, 0x00, 0x02,
+- 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x43,
+- 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x00,
+- 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42,
+- 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x43, 0x00, 0x02,
+- 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x41,
+- 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03,
+- 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x10,
+- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x41, 0x00, 0x02,
+- 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x19,
+- 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x42,
+- 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x29,
+- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x41, 0x00, 0x03,
+- 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02,
+- 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x31,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14,
+- 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x42,
+- 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x41,
+- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x41, 0x00, 0x02,
+- 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5,
+- 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02,
+- 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9,
+- 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9,
+- 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42,
+- 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5,
+- 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02,
+- 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41,
+- 0x00, 0x02, 0x03, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5,
+- 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02,
+- 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14,
+- 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14,
+- 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14,
+- 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14,
+- 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14,
+- 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14,
+- 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8,
+- 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x03, 0x91,
+- 0x03, 0x41, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41,
+- 0x00, 0x02, 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBF,
+- 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02,
+- 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x40, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x01,
+- 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02,
+- 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xCB,
+- 0x03, 0x01, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42,
+- 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xA8,
+- 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02,
+- 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40,
+- 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9,
+- 0x03, 0x41, 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xD1, 0x03, 0x85, 0x03, 0x86,
+- 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC,
+- 0x03, 0xAD, 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE,
+- 0x03, 0xD3, 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07,
+- 0x1F, 0x08, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10,
+- 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C,
+- 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27,
+- 0x1F, 0x28, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30,
+- 0x1F, 0x31, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38,
+- 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42,
+- 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D,
+- 0x1F, 0x50, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B,
+- 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66,
+- 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E,
+- 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x72, 0x1F, 0x73, 0x1F, 0x74, 0x1F, 0x75, 0x1F, 0x76,
+- 0x1F, 0x77, 0x1F, 0x78, 0x1F, 0x79, 0x1F, 0x7A, 0x1F, 0x7B, 0x1F, 0x7C, 0x1F, 0x7D, 0x1F, 0x80,
++ 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA1, 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8,
++ 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02,
++ 0x03, 0xCE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42,
++ 0x00, 0x02, 0x03, 0x9F, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9,
++ 0x03, 0x45, 0x00, 0x01, 0x00, 0xE8, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A,
++ 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD,
++ 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE,
++ 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05,
++ 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D,
++ 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15,
++ 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21,
++ 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29,
++ 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31,
++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39,
++ 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41,
++ 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B,
++ 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55,
++ 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61,
++ 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69,
++ 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x72,
++ 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82,
++ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A,
++ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92,
++ 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A,
++ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2,
++ 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA,
++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2,
++ 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8, 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBC,
++ 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4, 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA,
++ 0x1F, 0xCC, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6,
++ 0x1F, 0xD7, 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0,
++ 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8, 0x1F, 0xE9,
++ 0x1F, 0xEA, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xF2, 0x1F, 0xF3, 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7,
++ 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x06, 0x30, 0x00, 0xC0, 0x01, 0x86, 0x01, 0x8C,
++ 0x01, 0x92, 0x01, 0x98, 0x01, 0x9E, 0x01, 0xA4, 0x01, 0xAA, 0x01, 0xB0, 0x01, 0xB6, 0x01, 0xBC,
++ 0x01, 0xC2, 0x01, 0xC8, 0x01, 0xCE, 0x01, 0xD4, 0x01, 0xDA, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC,
++ 0x01, 0xF2, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E,
++ 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3E, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54,
++ 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84,
++ 0x02, 0x8A, 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB6,
++ 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC,
++ 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x04, 0x03, 0x0A, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20,
++ 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x46, 0x03, 0x4E, 0x03, 0x54,
++ 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84,
++ 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C, 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xB0, 0x03, 0xB8,
++ 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCC, 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA,
++ 0x03, 0xF2, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E,
++ 0x04, 0x26, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52,
++ 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82,
++ 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2,
++ 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2,
++ 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12,
++ 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42,
++ 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72,
++ 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2,
++ 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2,
++ 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, 0x05, 0xF2, 0x05, 0xF8, 0x06, 0x00, 0x06, 0x06,
++ 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x00, 0x02, 0x00, 0xA8,
++ 0x03, 0x41, 0x00, 0x02, 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02,
++ 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41,
++ 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA,
++ 0x03, 0x01, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02,
++ 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01,
++ 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5,
++ 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02,
++ 0x03, 0xB1, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40,
++ 0x00, 0x02, 0x1F, 0x00, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1,
++ 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91,
++ 0x03, 0x43, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02,
++ 0x1F, 0x08, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13,
++ 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43,
++ 0x00, 0x02, 0x1F, 0x10, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10,
++ 0x03, 0x41, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02,
++ 0x1F, 0x18, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41,
++ 0x00, 0x02, 0x1F, 0x19, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02,
++ 0x1F, 0x21, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7,
++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40,
++ 0x00, 0x02, 0x1F, 0x29, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29,
++ 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14,
++ 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02,
++ 0x1F, 0x30, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41,
++ 0x00, 0x02, 0x1F, 0x31, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03,
++ 0x03, 0xB9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02,
++ 0x1F, 0x39, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99,
++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40,
++ 0x00, 0x02, 0x1F, 0x41, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41,
++ 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02,
++ 0x1F, 0x49, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41,
++ 0x00, 0x02, 0x03, 0xC5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0xC5, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0x59, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14,
++ 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02,
++ 0x1F, 0x61, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42,
++ 0x00, 0x02, 0x03, 0xA9, 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02,
++ 0x1F, 0x69, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9,
++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x40,
++ 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF,
++ 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02,
++ 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9,
++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02,
++ 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45,
++ 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02,
++ 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41,
++ 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42,
++ 0x00, 0x02, 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE,
++ 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03,
++ 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40,
++ 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xC0, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88,
++ 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xAD,
++ 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3,
++ 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08,
++ 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x12,
++ 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D,
++ 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28,
++ 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31,
++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x3A,
++ 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42, 0x1F, 0x43,
++ 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50,
++ 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B, 0x1F, 0x5D,
++ 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67,
++ 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F,
++ 0x1F, 0x70, 0x1F, 0x72, 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80,
+ 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88,
+ 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90,
+ 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98,
+ 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0,
+ 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8,
+ 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2,
+- 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8,
+- 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2,
+- 0x1F, 0xD3, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2,
+- 0x1F, 0xE3, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xF2,
+- 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, 0xFC, 0x00, 0x01,
+- 0x05, 0x00, 0x00, 0x89, 0x01, 0x18, 0x01, 0x1E, 0x01, 0x24, 0x01, 0x2A, 0x01, 0x30, 0x01, 0x38,
+- 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78,
+- 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8,
+- 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8,
+- 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36,
+- 0x02, 0x3E, 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76,
+- 0x02, 0x7E, 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6,
+- 0x02, 0xBE, 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6,
+- 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34,
+- 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4A, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5E, 0x03, 0x64, 0x03, 0x6A,
+- 0x03, 0x70, 0x03, 0x76, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x94, 0x03, 0x9A, 0x03, 0xA0,
+- 0x03, 0xA6, 0x03, 0xAC, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xCA, 0x03, 0xD0, 0x03, 0xD6,
+- 0x03, 0xDC, 0x03, 0xE2, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C,
+- 0x04, 0x12, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x36, 0x04, 0x3C, 0x04, 0x42,
+- 0x04, 0x48, 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6C, 0x04, 0x72, 0x04, 0x78,
+- 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA8, 0x04, 0xAE,
+- 0x04, 0xB4, 0x04, 0xBC, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD2, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6,
+- 0x04, 0xEC, 0x04, 0xF4, 0x04, 0xFA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCA,
+- 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x41, 0x00, 0x03,
+- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03,
+- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03,
+- 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03,
+- 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03,
+- 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03,
+- 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03,
+- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03,
+- 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9,
+- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9,
+- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBE,
+- 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99,
+- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99,
+- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xBF,
+- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF,
+- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F,
+- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F,
+- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5,
+- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5,
+- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5,
+- 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA5,
+- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9,
+- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9,
+- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x02, 0x21, 0x26,
+- 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14,
+- 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02,
+- 0x1F, 0xB3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80,
+- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02,
+- 0x1F, 0x81, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0x88, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43,
+- 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41,
+- 0x00, 0x03, 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45,
+- 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02,
+- 0x1F, 0x98, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41,
+- 0x00, 0x02, 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03,
+- 0x1F, 0x29, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9,
+- 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC,
+- 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40,
+- 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9,
+- 0x03, 0x41, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03,
+- 0x03, 0xB1, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08,
+- 0x03, 0x00, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42,
+- 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x41, 0x00, 0x02,
+- 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x42,
+- 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, 0x00, 0x01,
+- 0x00, 0x89, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04,
+- 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12,
+- 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22,
+- 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D,
+- 0x1F, 0x2E, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37,
+- 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44,
+- 0x1F, 0x45, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54,
+- 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65,
+- 0x1F, 0x66, 0x1F, 0x68, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F,
+- 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85,
+- 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D,
+- 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
+- 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D,
+- 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5,
+- 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7,
+- 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xD7, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7,
+- 0x1F, 0xFA, 0x1F, 0xFB, 0x00, 0x01, 0x04, 0xE2, 0x00, 0x7F, 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10,
+- 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E,
+- 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E,
+- 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE,
+- 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C,
+- 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C,
+- 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C,
+- 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC2, 0x02, 0xCA,
+- 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xEA, 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06,
+- 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46,
+- 0x03, 0x4E, 0x03, 0x56, 0x03, 0x5E, 0x03, 0x66, 0x03, 0x6E, 0x03, 0x76, 0x03, 0x7E, 0x03, 0x86,
+- 0x03, 0x8E, 0x03, 0x96, 0x03, 0x9E, 0x03, 0xA6, 0x03, 0xAE, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6,
+- 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xEE, 0x03, 0xF6, 0x03, 0xFE, 0x04, 0x06,
+- 0x04, 0x0E, 0x04, 0x16, 0x04, 0x1E, 0x04, 0x26, 0x04, 0x2E, 0x04, 0x36, 0x04, 0x3E, 0x04, 0x46,
+- 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x66, 0x04, 0x6E, 0x04, 0x76, 0x04, 0x7E, 0x04, 0x84,
+- 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB8, 0x04, 0xC0,
+- 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDC, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02,
+- 0x1F, 0xBE, 0x03, 0x44, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40,
+- 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42,
+- 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40,
+- 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40,
+- 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40,
+- 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40,
+- 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40,
+- 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41,
+- 0x00, 0x02, 0x21, 0x26, 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03,
+- 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03,
+- 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02,
+- 0x1F, 0xBE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42,
+- 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03,
+- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x40, 0x00, 0x02,
+- 0x1F, 0xBE, 0x03, 0x44, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5,
+- 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3,
+- 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40,
+- 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAF,
+- 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C,
+- 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C,
+- 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C,
+- 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A,
+- 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A,
+- 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x5B,
+- 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A, 0x1F, 0x6B,
+- 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82,
++ 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA,
++ 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA,
++ 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xED, 0x1F, 0xF2,
++ 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0xE0, 0x00, 0x85,
++ 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, 0x01, 0x22, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40,
++ 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80,
++ 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0,
++ 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8, 0x02, 0x00,
++ 0x02, 0x08, 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E,
++ 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E,
++ 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE,
++ 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE,
++ 0x03, 0x06, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34, 0x03, 0x3C,
++ 0x03, 0x42, 0x03, 0x48, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x70,
++ 0x03, 0x78, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA6,
++ 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDC,
++ 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, 0x04, 0x12,
++ 0x04, 0x1A, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48,
++ 0x04, 0x50, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7E,
++ 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAE, 0x04, 0xB6,
++ 0x04, 0xBE, 0x04, 0xC6, 0x04, 0xCC, 0x04, 0xD2, 0x04, 0xDA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01,
++ 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB,
++ 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14,
++ 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14,
++ 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13,
++ 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13,
++ 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43,
++ 0x03, 0x42, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14,
++ 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14,
++ 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14,
++ 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14,
++ 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14,
++ 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14,
++ 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13,
++ 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13,
++ 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43,
++ 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42,
++ 0x00, 0x02, 0x21, 0x26, 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03,
++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03,
++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03,
++ 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xB3,
++ 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x40,
++ 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x81,
++ 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x42,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x88,
++ 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43, 0x00, 0x03,
++ 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x91,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41, 0x00, 0x03,
++ 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x98,
++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41, 0x00, 0x02,
++ 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29,
++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14,
++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40, 0x00, 0x02,
++ 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x42,
++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x43,
++ 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40, 0x00, 0x02,
++ 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x41,
++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42, 0x03, 0x45,
++ 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1,
++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x00,
++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00,
++ 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9,
++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x01, 0x00, 0x85, 0x03, 0x8F,
++ 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06,
++ 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14,
++ 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24,
++ 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x30,
++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x3A, 0x1F, 0x3B,
++ 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A,
++ 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56,
++ 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x68,
++ 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x76, 0x1F, 0x80,
++ 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88,
++ 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90,
++ 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98,
++ 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0,
++ 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8,
++ 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2,
++ 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD7, 0x1F, 0xE2,
++ 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x00, 0x01, 0x04, 0xC0, 0x00, 0x7B, 0x00, 0xFC,
++ 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36,
++ 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76,
++ 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6,
++ 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4,
++ 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34,
++ 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74,
++ 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4,
++ 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xF0,
++ 0x02, 0xF8, 0x03, 0x00, 0x03, 0x08, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x30,
++ 0x03, 0x38, 0x03, 0x40, 0x03, 0x48, 0x03, 0x50, 0x03, 0x58, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70,
++ 0x03, 0x78, 0x03, 0x80, 0x03, 0x88, 0x03, 0x90, 0x03, 0x98, 0x03, 0xA0, 0x03, 0xA8, 0x03, 0xB0,
++ 0x03, 0xB8, 0x03, 0xC0, 0x03, 0xC8, 0x03, 0xD0, 0x03, 0xD8, 0x03, 0xE0, 0x03, 0xE8, 0x03, 0xF0,
++ 0x03, 0xF8, 0x04, 0x00, 0x04, 0x08, 0x04, 0x10, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x30,
++ 0x04, 0x38, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x58, 0x04, 0x60, 0x04, 0x68, 0x04, 0x70,
++ 0x04, 0x76, 0x04, 0x7E, 0x04, 0x86, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9C, 0x04, 0xA4, 0x04, 0xAC,
++ 0x04, 0xB2, 0x04, 0xBA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x44,
++ 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03,
++ 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
++ 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
++ 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
++ 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
++ 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
++ 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
++ 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02,
++ 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9,
++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9,
++ 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5,
++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, 0x21, 0x26,
++ 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14,
++ 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14,
++ 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x40,
++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14,
++ 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14,
++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14,
++ 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14,
++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14,
++ 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14,
++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03,
++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02,
++ 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9,
++ 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9,
++ 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45,
++ 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40, 0x00, 0x01, 0x00, 0x7B, 0x03, 0x8F, 0x03, 0x90,
++ 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B,
++ 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B,
++ 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B,
++ 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36,
++ 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45,
++ 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55,
++ 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A,
++ 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82,
+ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A,
+ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92,
+ 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A,
+ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2,
+ 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA,
+ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7,
+- 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xF2,
+- 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x1F, 0xFB, 0x00, 0x01, 0x03, 0x62, 0x00, 0x56, 0x00, 0xB2,
+- 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF2,
+- 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32,
+- 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x52, 0x01, 0x5A, 0x01, 0x62, 0x01, 0x6A, 0x01, 0x72,
+- 0x01, 0x7A, 0x01, 0x82, 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB2,
+- 0x01, 0xBA, 0x01, 0xC2, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xDA, 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2,
+- 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x1A, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x32,
+- 0x02, 0x3A, 0x02, 0x42, 0x02, 0x4A, 0x02, 0x52, 0x02, 0x5A, 0x02, 0x62, 0x02, 0x6A, 0x02, 0x72,
+- 0x02, 0x7A, 0x02, 0x82, 0x02, 0x8A, 0x02, 0x92, 0x02, 0x9A, 0x02, 0xA2, 0x02, 0xAA, 0x02, 0xB2,
+- 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xEA, 0x02, 0xF2,
+- 0x02, 0xFA, 0x03, 0x02, 0x03, 0x0A, 0x03, 0x12, 0x03, 0x1A, 0x03, 0x22, 0x03, 0x2A, 0x03, 0x32,
+- 0x03, 0x3A, 0x03, 0x42, 0x03, 0x4A, 0x03, 0x52, 0x03, 0x5A, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14,
+- 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14,
+- 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x56, 0x03, 0x90,
+- 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A,
+- 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34,
+- 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C,
+- 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D,
+- 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87,
+- 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90,
+- 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A,
+- 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3,
+- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB,
+- 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4,
+- 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xE3, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x46, 0x00, 0x52,
+- 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2,
+- 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22,
+- 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x52, 0x01, 0x5A, 0x01, 0x62,
+- 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7A, 0x01, 0x82, 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2,
+- 0x01, 0xAA, 0x01, 0xB2, 0x01, 0xBA, 0x01, 0xC2, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xDC, 0x01, 0xE4,
+- 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26,
+- 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46, 0x02, 0x50, 0x02, 0x58, 0x02, 0x60, 0x02, 0x68,
+- 0x02, 0x70, 0x02, 0x78, 0x02, 0x80, 0x02, 0x8A, 0x02, 0x92, 0x02, 0x9A, 0x02, 0xA2, 0x02, 0xAA,
+- 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC,
+- 0x02, 0xF4, 0x02, 0xFC, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E,
+- 0x03, 0x36, 0x03, 0x3E, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1,
++ 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xE2, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7,
++ 0x1F, 0xFA, 0x00, 0x01, 0x03, 0x4E, 0x00, 0x54, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6,
++ 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06,
++ 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46,
++ 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86,
++ 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6,
++ 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFE, 0x02, 0x06,
++ 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46,
++ 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x86,
++ 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, 0x02, 0xC6,
++ 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06,
++ 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46,
++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41,
++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45,
++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x01, 0x00, 0x54, 0x03, 0x90, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C,
++ 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C,
++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42,
++ 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A,
++ 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84,
++ 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D,
++ 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96,
++ 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F,
++ 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8,
++ 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2,
++ 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x3C,
++ 0x00, 0x51, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8,
++ 0x00, 0xE0, 0x00, 0xE8, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x18,
++ 0x01, 0x20, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58,
++ 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98,
++ 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xDA,
++ 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2, 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x14, 0x02, 0x1C,
++ 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E,
++ 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x98, 0x02, 0xA0,
++ 0x02, 0xA8, 0x02, 0xB0, 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2,
++ 0x02, 0xEA, 0x02, 0xF2, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24,
++ 0x03, 0x2C, 0x03, 0x34, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1,
+ 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91,
+ 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5,
+ 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95,
+@@ -1960,1728 +1911,1637 @@
+ 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45,
+ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x41, 0x03, 0x45,
+ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x41, 0x03, 0x45,
+- 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41,
+- 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45,
+- 0x00, 0x01, 0x00, 0x52, 0x03, 0x90, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12,
+- 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32,
+- 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A,
+- 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C,
+- 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87,
+- 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90,
+- 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A,
+- 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3,
+- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB,
+- 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4,
+- 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x02, 0x3A, 0x00, 0x36, 0x00, 0x72,
+- 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x00, 0xB2,
+- 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCC, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6,
+- 0x00, 0xFE, 0x01, 0x08, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A,
+- 0x01, 0x44, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80,
+- 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB2, 0x01, 0xBC, 0x01, 0xC6,
+- 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF8, 0x02, 0x02, 0x02, 0x0A,
+- 0x02, 0x12, 0x02, 0x1A, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x32, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08,
+- 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13,
+- 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03,
+- 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03,
+- 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03,
+- 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45,
+- 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7,
+- 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03,
+- 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03,
+- 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
+- 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03,
+- 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03,
+- 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03,
+- 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08,
+- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45,
+- 0x03, 0x01, 0x00, 0x01, 0x00, 0x36, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C,
+- 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88,
+- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92,
+- 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B,
+- 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4,
+- 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD3, 0x1F, 0xF2,
+- 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xEA, 0x00, 0x2E, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A,
+- 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE,
+- 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE8, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02,
+- 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46,
+- 0x01, 0x50, 0x01, 0x5A, 0x01, 0x62, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7A, 0x01, 0x84, 0x01, 0x8E,
+- 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xC0, 0x01, 0xCA, 0x01, 0xD2,
+- 0x01, 0xDA, 0x01, 0xE2, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE,
+- 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26,
+- 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3,
+- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3,
+- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1,
+- 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42,
+- 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00,
+- 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
+- 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3,
+- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3,
+- 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00,
+- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01,
+- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3,
+- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3,
+- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9,
+- 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42,
+- 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00,
+- 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01,
+- 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45,
+- 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1,
+- 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE,
+- 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2E,
++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00,
++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x51, 0x03, 0x90, 0x1F, 0x02,
++ 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22,
++ 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A,
++ 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62,
++ 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83,
++ 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C,
++ 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
++ 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E,
++ 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7,
++ 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF,
++ 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01,
++ 0x02, 0x30, 0x00, 0x35, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98,
++ 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD4, 0x00, 0xDC,
++ 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x20,
++ 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x42, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64,
++ 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8,
++ 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC,
++ 0x01, 0xF6, 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x18, 0x02, 0x20, 0x02, 0x28, 0x00, 0x03,
++ 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03,
++ 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03,
++ 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03,
++ 0x1F, 0x00, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03,
++ 0x1F, 0x00, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45,
++ 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45,
++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45,
++ 0x03, 0x41, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13,
++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03,
++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03,
++ 0x1F, 0x21, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03,
++ 0x1F, 0x21, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45,
++ 0x03, 0x43, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45,
++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97,
++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03,
++ 0x1F, 0x60, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03,
++ 0x1F, 0x60, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45,
++ 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45,
++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45,
++ 0x03, 0x41, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13,
++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03,
++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03,
++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03,
++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01,
++ 0x00, 0x35, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x80, 0x1F, 0x82,
++ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B,
++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94,
++ 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D,
++ 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6,
++ 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF,
++ 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xE0,
++ 0x00, 0x2D, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90,
++ 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4,
++ 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A,
++ 0x01, 0x24, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60,
++ 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4,
++ 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x00, 0x03, 0x1F, 0xBE,
++ 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3,
++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3,
++ 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04,
++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00,
++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01,
++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3,
++ 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3,
++ 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3,
++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3,
++ 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04,
++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00,
++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7,
++ 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2D,
+ 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84,
+ 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E,
+ 0x1F, 0x8F, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x9A,
+ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4,
+ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xD3, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C,
+- 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E,
+- 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2,
+- 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04,
+- 0x01, 0x0C, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48,
+- 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13,
+- 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13,
+- 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC,
+- 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC,
+- 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03,
+- 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03,
+- 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40,
+- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41,
+- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14,
+- 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26,
+- 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC,
+- 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC,
+- 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04,
+- 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34,
+- 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A,
++ 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C, 0x00, 0x24,
++ 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86,
++ 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2, 0x00, 0xCA,
++ 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04, 0x01, 0x0C,
++ 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50,
++ 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x40,
++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x41,
++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42,
++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14,
++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3,
++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03,
++ 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03,
++ 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x40,
++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43,
++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14,
++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26,
++ 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A,
++ 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B,
++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96,
++ 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4,
++ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE,
++ 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66,
++ 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAE,
++ 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE, 0x00, 0xF8,
++ 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x40,
++ 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, 0x01, 0x8A,
++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x41,
++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x41,
++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00,
++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14,
++ 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03,
++ 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3,
++ 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03,
++ 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC,
++ 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x00,
++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43,
++ 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9,
++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03,
++ 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26,
++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A,
++ 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B,
++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96,
++ 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4,
++ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE,
++ 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x60,
++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, 0x00, 0xAA,
++ 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4,
++ 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C,
++ 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x40,
++ 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1,
++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04,
++ 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
++ 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13,
++ 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14,
++ 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97,
++ 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42,
++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40,
++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14,
++ 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03,
++ 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04,
++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45,
++ 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x01,
++ 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B,
++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96,
++ 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4,
++ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE,
++ 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60,
++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0,
++ 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00,
++ 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50,
++ 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1,
++ 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13,
++ 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04,
++ 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13,
++ 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04,
++ 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45,
++ 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9,
++ 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00,
++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14,
++ 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04,
++ 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9,
++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42,
++ 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A,
+ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
+ 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3,
+- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E,
+- 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4,
+- 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE,
+- 0x00, 0xF8, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38,
+- 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80,
+- 0x01, 0x8A, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43,
+- 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43,
+- 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14,
+- 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1,
+- 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42,
+- 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14,
+- 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03,
+- 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45,
+- 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC,
+- 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03,
+- 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43,
+- 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3,
+- 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04,
+- 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13,
+- 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14,
+- 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04,
+- 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34,
+- 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A,
+- 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
+- 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3,
+- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58,
+- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2,
+- 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA,
+- 0x00, 0xF4, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34,
+- 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43,
+- 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3,
+- 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04,
+- 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45,
+- 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04,
+- 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13,
+- 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14,
+- 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9,
+- 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42,
+- 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40,
+- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9,
+- 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42,
+- 0x00, 0x01, 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A,
+- 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
+- 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3,
+- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56,
+- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6,
+- 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6,
+- 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46,
+- 0x01, 0x50, 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13,
+- 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04,
+- 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00,
+- 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13,
+- 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00,
+- 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14,
+- 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04,
+- 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9,
+- 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42,
+- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04,
+- 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43,
+- 0x03, 0x42, 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86,
+- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94,
+- 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2,
+- 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56,
+- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6,
+- 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6,
+- 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13,
+- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13,
+- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13,
+- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xC9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9,
+- 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85,
+- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
+- 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5,
+- 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19,
+- 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E,
+- 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE,
+- 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E,
+- 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01,
+- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04,
+- 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01,
+- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04,
+- 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01,
+- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04,
+- 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14,
+- 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19,
+- 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D,
+- 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D,
+- 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56,
+- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6,
+- 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6,
+- 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13,
+- 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13,
+- 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13,
+- 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14,
+- 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43,
+- 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85,
+- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95,
+- 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5,
+- 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F,
+- 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A,
+- 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04,
+- 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43,
+- 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04,
+- 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45,
+- 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C,
+- 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB,
+- 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E,
+- 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E,
+- 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43,
+- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04,
+- 0x03, 0x91, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41,
+- 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7,
+- 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45,
+- 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43,
+- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04,
+- 0x03, 0xA9, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40,
+- 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42,
+- 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94,
+- 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD,
+- 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42,
+- 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92,
+- 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00,
+- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00,
+- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04,
+- 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45,
+- 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F,
+- 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C,
+- 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01,
+- 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54,
+- 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4,
+- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04,
+- 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45,
+- 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E,
+- 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C,
+- 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE,
++ 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE,
++ 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60,
++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0,
++ 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00,
++ 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1,
++ 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14,
++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14,
++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9,
++ 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14,
++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42,
++ 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A,
++ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A,
++ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA,
++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38,
++ 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88,
++ 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8,
++ 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28,
++ 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04,
++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04,
++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04,
++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82,
++ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92,
++ 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2,
++ 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE,
++ 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60,
++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0,
++ 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00,
++ 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45,
++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9,
++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42,
++ 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A,
++ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A,
++ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA,
++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24,
++ 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74,
++ 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1,
++ 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43,
++ 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9,
++ 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14,
++ 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04,
++ 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92,
++ 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC,
++ 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38,
++ 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88,
++ 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x40,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91,
++ 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43,
++ 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04,
++ 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x40,
++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9,
++ 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14,
++ 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x01,
++ 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A,
++ 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE,
++ 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C,
++ 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C,
++ 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04,
++ 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43,
++ 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04,
++ 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9,
++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82,
++ 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2,
++ 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xAE,
+ 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E,
+ 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04,
+- 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00,
+- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45,
+- 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04,
+- 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01,
+- 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82,
++ 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91,
++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40,
++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43,
++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26,
++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82,
+ 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2,
+ 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E,
+ 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68,
+ 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1,
+- 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
+- 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13,
+- 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9,
+- 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45,
+- 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04,
+- 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84,
++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
++ 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04,
++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9,
++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45,
++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04,
++ 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84,
+ 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4,
+- 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E,
++ 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22,
++ 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72,
++ 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40,
++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14,
++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26,
++ 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A,
++ 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA,
++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x28,
++ 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78,
++ 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04,
++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7,
++ 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01,
++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45,
++ 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04,
++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43,
++ 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0C,
++ 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C,
++ 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E,
+ 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E,
+- 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00,
+- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
+- 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04,
+- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43,
+- 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97,
+- 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00,
+- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45,
+- 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01,
++ 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40,
++ 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45,
++ 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04,
++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43,
++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97,
++ 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40,
++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45,
++ 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01,
+ 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A,
+- 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C,
+- 0x00, 0x1E, 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64,
+- 0x00, 0x6E, 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43,
+- 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91,
+- 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41,
+- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45,
+- 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04,
+- 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43,
+- 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9,
+- 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41,
+- 0x00, 0x01, 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94,
+- 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E,
+- 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45,
+- 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA,
++ 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02,
++ 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04,
++ 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC,
++ 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13,
++ 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01,
++ 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13,
++ 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E,
++ 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA,
+ 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45,
++ 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45,
+ 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A,
+- 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01,
+- 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45,
+- 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02,
++ 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26,
++ 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01,
++ 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02,
+ 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04,
+- 0x21, 0x26, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01,
+- 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02,
+- 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04,
+- 0x21, 0x26, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC,
+- 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01,
++ 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45,
++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02,
++ 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04,
++ 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC,
++ 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45,
++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x01,
+ 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14,
+- 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43,
+- 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E,
+- 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00,
+- 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA,
+- 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41,
+- 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A,
+- 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26,
+- 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01,
+- 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43,
+- 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02,
+- 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4E,
+- 0x00, 0x06, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, 0x00, 0x44, 0x00, 0x01,
+- 0x00, 0x04, 0x0A, 0x59, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x5A, 0x00, 0x02,
+- 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x5B, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04,
+- 0x0A, 0x5E, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x33, 0x00, 0x02, 0x0A, 0x3C,
+- 0x00, 0x01, 0x00, 0x04, 0x0A, 0x36, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x06, 0x0A, 0x16,
+- 0x0A, 0x17, 0x0A, 0x1C, 0x0A, 0x2B, 0x0A, 0x32, 0x0A, 0x38, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x36, 0x00, 0x06, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24,
+- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x02, 0x0A, 0x32, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x38, 0x0A, 0x3C,
+- 0x00, 0x02, 0x0A, 0x16, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x17, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x1C,
+- 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x2B, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x06, 0x0A, 0x33, 0x0A, 0x36,
+- 0x0A, 0x59, 0x0A, 0x5A, 0x0A, 0x5B, 0x0A, 0x5E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
+- 0x00, 0x01, 0x01, 0xB6, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x54, 0x00, 0x66, 0x00, 0x70, 0x00, 0x7A,
+- 0x00, 0x84, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD8, 0x00, 0xE2,
+- 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x30, 0x01, 0x3A,
+- 0x01, 0x7C, 0x01, 0x86, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xA4, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E,
+- 0x00, 0x14, 0xFB, 0x2E, 0x00, 0x02, 0x05, 0xB7, 0xFB, 0x2F, 0x00, 0x02, 0x05, 0xB8, 0xFB, 0x30,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x31, 0x00, 0x02, 0x05, 0xBC,
+- 0xFB, 0x4C, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x32, 0x00, 0x02, 0x05, 0xBC,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x33, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x34,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x4B, 0x00, 0x02, 0x05, 0xB9,
+- 0xFB, 0x35, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x36, 0x00, 0x02, 0x05, 0xBC,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x38, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0xFB, 0x1D, 0x00, 0x02, 0x05, 0xB4, 0xFB, 0x39, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04,
+- 0xFB, 0x3A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x3B, 0x00, 0x02,
+- 0x05, 0xBC, 0xFB, 0x4D, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3C, 0x00, 0x02,
+- 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3E, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04,
+- 0xFB, 0x40, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x41, 0x00, 0x02, 0x05, 0xBC,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x43, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0xFB, 0x44, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4E, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04,
+- 0xFB, 0x46, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x47, 0x00, 0x02, 0x05, 0xBC,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x48, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18,
+- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0xFB, 0x2C, 0x00, 0x03, 0x05, 0xBC,
+- 0x05, 0xC1, 0xFB, 0x2D, 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC2, 0xFB, 0x49, 0x00, 0x02, 0x05, 0xBC,
+- 0xFB, 0x2C, 0x00, 0x03, 0x05, 0xC1, 0x05, 0xBC, 0xFB, 0x2A, 0x00, 0x02, 0x05, 0xC1, 0xFB, 0x2D,
+- 0x00, 0x03, 0x05, 0xC2, 0x05, 0xBC, 0xFB, 0x2B, 0x00, 0x02, 0x05, 0xC2, 0x00, 0x01, 0x00, 0x04,
+- 0xFB, 0x4A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x1F, 0x00, 0x02, 0x05, 0xB7,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x2C, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x2D,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x2C, 0x00, 0x02, 0x05, 0xC1,
+- 0xFB, 0x2D, 0x00, 0x02, 0x05, 0xC2, 0x00, 0x01, 0x00, 0x1A, 0x05, 0xD0, 0x05, 0xD1, 0x05, 0xD2,
+- 0x05, 0xD3, 0x05, 0xD4, 0x05, 0xD5, 0x05, 0xD6, 0x05, 0xD8, 0x05, 0xD9, 0x05, 0xDA, 0x05, 0xDB,
+- 0x05, 0xDC, 0x05, 0xDE, 0x05, 0xE0, 0x05, 0xE1, 0x05, 0xE3, 0x05, 0xE4, 0x05, 0xE6, 0x05, 0xE7,
+- 0x05, 0xE8, 0x05, 0xE9, 0x05, 0xEA, 0x05, 0xF2, 0xFB, 0x2A, 0xFB, 0x2B, 0xFB, 0x49, 0x00, 0x02,
+- 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x01, 0x6C, 0x01, 0x8A, 0x01, 0xAC, 0x00, 0x01, 0x01, 0x16,
+- 0x00, 0x22, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E,
+- 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E,
+- 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE,
+- 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0xFE,
+- 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, 0x00, 0x02, 0x05, 0xD9, 0x05, 0xB4, 0x00, 0x02, 0x05, 0xF2,
+- 0x05, 0xB7, 0x00, 0x02, 0x05, 0xE9, 0x05, 0xC1, 0x00, 0x02, 0x05, 0xE9, 0x05, 0xC2, 0x00, 0x02,
+- 0xFB, 0x2A, 0x05, 0xBC, 0x00, 0x02, 0xFB, 0x2B, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD0, 0x05, 0xB7,
+- 0x00, 0x02, 0x05, 0xD0, 0x05, 0xB8, 0x00, 0x02, 0x05, 0xD0, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD1,
+- 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD2, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD3, 0x05, 0xBC, 0x00, 0x02,
+- 0x05, 0xD4, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD5, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD6, 0x05, 0xBC,
+- 0x00, 0x02, 0x05, 0xD8, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD9, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDA,
+- 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDB, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDC, 0x05, 0xBC, 0x00, 0x02,
+- 0x05, 0xDE, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE0, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE1, 0x05, 0xBC,
+- 0x00, 0x02, 0x05, 0xE3, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE4, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE6,
+- 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE7, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE8, 0x05, 0xBC, 0x00, 0x02,
+- 0x05, 0xE9, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xEA, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD5, 0x05, 0xB9,
+- 0x00, 0x02, 0x05, 0xD1, 0x05, 0xBF, 0x00, 0x02, 0x05, 0xDB, 0x05, 0xBF, 0x00, 0x02, 0x05, 0xE4,
+- 0x05, 0xBF, 0x00, 0x01, 0x00, 0x22, 0xFB, 0x1D, 0xFB, 0x1F, 0xFB, 0x2A, 0xFB, 0x2B, 0xFB, 0x2C,
+- 0xFB, 0x2D, 0xFB, 0x2E, 0xFB, 0x2F, 0xFB, 0x30, 0xFB, 0x31, 0xFB, 0x32, 0xFB, 0x33, 0xFB, 0x34,
+- 0xFB, 0x35, 0xFB, 0x36, 0xFB, 0x38, 0xFB, 0x39, 0xFB, 0x3A, 0xFB, 0x3B, 0xFB, 0x3C, 0xFB, 0x3E,
+- 0xFB, 0x40, 0xFB, 0x41, 0xFB, 0x43, 0xFB, 0x44, 0xFB, 0x46, 0xFB, 0x47, 0xFB, 0x48, 0xFB, 0x49,
+- 0xFB, 0x4A, 0xFB, 0x4B, 0xFB, 0x4C, 0xFB, 0x4D, 0xFB, 0x4E, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02,
+- 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02, 0xFB, 0x49, 0x05, 0xC1, 0x00, 0x02, 0xFB, 0x49, 0x05, 0xC2,
+- 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x0A,
+- 0x00, 0x12, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xBC, 0x05, 0xC1, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xBC,
+- 0x05, 0xC2, 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x02,
+- 0x00, 0x0A, 0x00, 0x12, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xC1, 0x05, 0xBC, 0x00, 0x03, 0x05, 0xE9,
+- 0x05, 0xC2, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x04, 0x00, 0x00,
+- 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46,
+- 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96,
+- 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6,
+- 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04, 0x30, 0x94, 0x00, 0x02, 0x30, 0x99,
+- 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E,
+- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
+- 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x54, 0x00, 0x02,
+- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
+- 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99,
+- 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E,
+- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
+- 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x65, 0x00, 0x02,
+- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
+- 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02,
+- 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73,
+- 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06,
+- 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02,
+- 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A,
+- 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x16, 0x30, 0x46,
+- 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53, 0x30, 0x55, 0x30, 0x57, 0x30, 0x59,
+- 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64, 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F,
+- 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E,
+- 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E,
+- 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE,
+- 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02,
+- 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99,
+- 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53, 0x30, 0x99, 0x00, 0x02, 0x30, 0x55,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02, 0x30, 0x59, 0x30, 0x99, 0x00, 0x02,
+- 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99,
+- 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64, 0x30, 0x99, 0x00, 0x02, 0x30, 0x66,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02,
+- 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99, 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A,
+- 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02,
+- 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99, 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99,
+- 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50, 0x30, 0x52, 0x30, 0x54, 0x30, 0x56,
+- 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60, 0x30, 0x62, 0x30, 0x65, 0x30, 0x67,
+- 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74, 0x30, 0x76, 0x30, 0x77, 0x30, 0x79,
+- 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01,
+- 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18,
+- 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5, 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2,
+- 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02, 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04,
+- 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03, 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA,
+- 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05,
+- 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5,
+- 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6,
+- 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7,
+- 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03,
+- 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01, 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00,
+- 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E,
+- 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E,
+- 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE,
+- 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48, 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01,
+- 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02,
+- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
+- 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99,
+- 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6,
+- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
+- 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02,
+- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
+- 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99,
+- 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7,
+- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02,
+- 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A,
+- 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02,
+- 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7,
+- 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99,
+- 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02,
+- 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02,
+- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
+- 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99,
+- 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6,
+- 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3, 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9,
+- 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4, 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF,
+- 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF, 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2,
+- 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F,
+- 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E,
+- 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E,
+- 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE,
+- 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02,
+- 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99,
+- 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02,
+- 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99,
+- 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02,
+- 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A,
+- 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02,
+- 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99,
+- 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2,
+- 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE,
+- 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8, 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE,
+- 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9, 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3,
+- 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA, 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4,
+- 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18, 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6,
+- 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4, 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6,
+- 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70, 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C,
+- 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4, 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82,
+- 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80, 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72,
+- 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54, 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40,
+- 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88, 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E,
+- 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0, 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06,
+- 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90, 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06,
+- 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88, 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE,
+- 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38, 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE,
+- 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40, 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E,
+- 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0, 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E,
+- 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0, 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E,
+- 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50, 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E,
+- 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0, 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE,
+- 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08, 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E,
+- 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54,
+- 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92,
+- 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC,
+- 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04,
+- 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C,
+- 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03,
+- 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03,
+- 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03,
+- 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02,
+- 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0,
+- 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4,
+- 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6,
+- 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE,
+- 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03,
+- 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08,
+- 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA,
+- 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5,
+- 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F,
+- 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6,
+- 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02,
+- 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1,
+- 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02,
+- 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A,
+- 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46,
+- 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02,
+- 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C,
+- 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03,
+- 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41,
+- 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A,
+- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02,
+- 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12,
+- 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A,
+- 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88,
+- 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2,
+- 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4,
+- 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8,
+- 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14,
+- 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14,
+- 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x12,
+- 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x14, 0x00, 0x02,
+- 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA,
+- 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F,
+- 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8,
+- 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x28, 0x00, 0x02,
+- 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A,
+- 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18,
+- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02,
+- 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E,
+- 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C,
+- 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10,
+- 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x24, 0x00, 0x02,
+- 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E,
+- 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27,
+- 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C,
+- 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70,
+- 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0,
+- 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02,
+- 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C,
+- 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08,
+- 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08,
+- 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02,
+- 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E,
+- 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40,
+- 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x44, 0x00, 0x01, 0x00, 0x04,
+- 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20,
+- 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C,
+- 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02,
+- 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22,
+- 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x01, 0x39, 0x00, 0x02,
+- 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C,
+- 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36, 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B,
+- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31,
+- 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C,
+- 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02,
+- 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24,
+- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54,
+- 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02, 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02,
+- 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46,
+- 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D,
+- 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x40, 0x01, 0x43, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E,
+- 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC,
+- 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A,
+- 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42,
+- 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78,
+- 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6,
+- 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03,
+- 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01,
+- 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00,
+- 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03,
+- 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23,
+- 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41,
+- 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C,
+- 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0,
+- 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5,
+- 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03,
+- 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03,
+- 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02,
+- 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04,
+- 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6,
+- 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02,
+- 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C,
+- 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B,
+- 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B,
+- 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B,
+- 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B,
+- 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02,
+- 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC, 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC,
+- 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02, 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03,
+- 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41,
+- 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14,
+- 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38,
+- 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x54, 0x00, 0x02, 0x03, 0x01,
+- 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58, 0x00, 0x02, 0x03, 0x07, 0x01, 0x58,
+- 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x12, 0x00, 0x02, 0x03, 0x11,
+- 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A, 0x00, 0x02, 0x03, 0x23, 0x01, 0x56,
+- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31, 0x01, 0x54, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46,
+- 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03,
+- 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02,
+- 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66,
+- 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03,
+- 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23, 0x02, 0x18, 0x00, 0x02, 0x03, 0x26,
+- 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A,
+- 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28,
+- 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C,
+- 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02, 0x03, 0x26, 0x01, 0x62, 0x00, 0x02,
+- 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D,
+- 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E,
+- 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8,
+- 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00,
+- 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A,
+- 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70,
+- 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00,
+- 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B,
+- 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03,
+- 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03,
+- 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04,
+- 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB,
+- 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5,
+- 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB,
+- 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC,
+- 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02,
+- 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3,
+- 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x16, 0x00, 0x02, 0x03, 0x11,
+- 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01,
+- 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09,
+- 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40,
+- 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0,
+- 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02,
+- 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74,
+- 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02,
+- 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41,
+- 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02,
+- 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
+- 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00,
+- 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02,
+- 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80,
+- 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02, 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18,
+- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48,
+- 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01,
+- 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02, 0x03, 0x03, 0x02, 0x32, 0x00, 0x02,
+- 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6,
+- 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40,
+- 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22,
+- 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02,
+- 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92,
+- 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31, 0x01, 0x79, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45,
++ 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E,
++ 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40,
++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA,
++ 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16,
++ 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78,
++ 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8,
++ 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6, 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04,
++ 0x30, 0x94, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99,
++ 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50,
++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
++ 0x00, 0x04, 0x30, 0x54, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02,
++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
++ 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99,
++ 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60,
++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
++ 0x00, 0x04, 0x30, 0x65, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02,
++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06,
++ 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02, 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02,
++ 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73, 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A,
++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02,
++ 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A,
++ 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99,
++ 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99,
++ 0x00, 0x01, 0x00, 0x16, 0x30, 0x46, 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53,
++ 0x30, 0x55, 0x30, 0x57, 0x30, 0x59, 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64,
++ 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F, 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D,
++ 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C,
++ 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C,
++ 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C,
++ 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC,
++ 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02, 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53,
++ 0x30, 0x99, 0x00, 0x02, 0x30, 0x55, 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02,
++ 0x30, 0x59, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64,
++ 0x30, 0x99, 0x00, 0x02, 0x30, 0x66, 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02,
++ 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75,
++ 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78, 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02,
++ 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50,
++ 0x30, 0x52, 0x30, 0x54, 0x30, 0x56, 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60,
++ 0x30, 0x62, 0x30, 0x65, 0x30, 0x67, 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74,
++ 0x30, 0x76, 0x30, 0x77, 0x30, 0x79, 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E,
++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C,
++ 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04,
++ 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5,
++ 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2, 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02,
++ 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03,
++ 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46,
++ 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28,
++ 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6,
++ 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01,
++ 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7, 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10,
++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01,
++ 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A,
++ 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80,
++ 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0,
++ 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE, 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48,
++ 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
++ 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02,
++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
++ 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99,
++ 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8,
++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01,
++ 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02,
++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
++ 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99,
++ 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9,
++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99,
++ 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02,
++ 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6,
++ 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
++ 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06,
++ 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01,
++ 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02,
++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04,
++ 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99,
++ 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6, 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3,
++ 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9, 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4,
++ 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF, 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF,
++ 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2, 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
++ 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C,
++ 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C,
++ 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC,
++ 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC,
++ 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3,
++ 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02,
++ 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4,
++ 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02,
++ 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5,
++ 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02,
++ 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99,
++ 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1,
++ 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01,
++ 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE, 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8,
++ 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE, 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9,
++ 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3, 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA,
++ 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4, 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE,
++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18,
++ 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6, 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4,
++ 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6, 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70,
++ 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C, 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4,
++ 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82, 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80,
++ 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72, 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54,
++ 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40, 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88,
++ 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E, 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0,
++ 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06, 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90,
++ 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06, 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88,
++ 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE, 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38,
++ 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE, 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40,
++ 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E, 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0,
++ 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E, 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0,
++ 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E, 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50,
++ 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E, 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0,
++ 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE, 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08,
++ 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88,
+ 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A,
+ 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4,
+ 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0,
+ 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26,
+- 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0,
+- 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02,
+- 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x01,
+- 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03,
+- 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03,
+- 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03,
+- 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x03, 0x00, 0x02,
+- 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x27, 0x00, 0x02, 0x03, 0x07,
+- 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3,
+- 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03,
+- 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C,
+- 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03,
+- 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02,
+- 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05, 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0,
+- 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E,
+- 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07,
++ 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0,
++ 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02,
++ 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02,
++ 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02,
++ 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02,
++ 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00,
++ 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03,
++ 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03,
++ 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03,
++ 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02,
++ 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07,
++ 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2,
++ 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03,
++ 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C,
++ 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03,
++ 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02,
++ 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02, 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0,
++ 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E,
++ 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06,
+ 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
+- 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01,
+- 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B,
+- 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27,
+- 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27,
+- 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06,
+- 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02,
+- 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11,
+- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31,
++ 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01,
++ 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A,
++ 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27,
++ 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27,
++ 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06,
++ 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02,
++ 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10,
++ 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31,
+ 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70,
+ 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC,
+ 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0,
+ 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14,
+- 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01,
+- 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01,
+- 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09,
+- 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40,
+- 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD,
+- 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03,
+- 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03,
+- 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06,
+- 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17, 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB,
+- 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C,
+- 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03,
+- 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27,
+- 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19,
+- 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40,
+- 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07,
++ 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01,
++ 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01,
++ 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09,
++ 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40,
++ 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC,
++ 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03,
++ 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03,
++ 0x03, 0x04, 0x03, 0x41, 0x01, 0x12, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06,
++ 0x03, 0x27, 0x01, 0x14, 0x00, 0x02, 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB,
++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C,
++ 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03,
++ 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27,
++ 0x03, 0x06, 0x02, 0x28, 0x00, 0x02, 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18,
++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A, 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40,
++ 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07,
+ 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36,
+- 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21,
+- 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06, 0x01, 0x21, 0x00, 0x02, 0x03, 0x07,
+- 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
+- 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07,
+- 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02,
+- 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B, 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96,
+- 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40,
+- 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74,
+- 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02,
+- 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x29,
+- 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04, 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06,
+- 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41,
+- 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02, 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02,
+- 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB,
+- 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30,
+- 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02,
+- 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35, 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0,
+- 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26,
+- 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33,
+- 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31,
+- 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28,
+- 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01,
+- 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39,
+- 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02, 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02,
+- 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B, 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A,
+- 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23,
+- 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A,
+- 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9,
+- 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01, 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03,
+- 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02,
+- 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49,
+- 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x01, 0x44, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96,
+- 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4,
+- 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12,
+- 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A,
+- 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80,
+- 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC,
+- 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00,
+- 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B,
+- 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1,
+- 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5,
+- 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3,
+- 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4,
+- 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03,
+- 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03,
+- 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02,
+- 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04,
+- 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04,
+- 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04,
+- 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F,
+- 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02,
+- 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09,
+- 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02,
+- 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00,
+- 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03,
+- 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23,
+- 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41,
+- 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3,
+- 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02, 0x03, 0x23, 0x01, 0xED, 0x00, 0x03,
+- 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40,
+- 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B,
+- 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E,
+- 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D,
+- 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02, 0x03, 0x07, 0x01, 0x59, 0x00, 0x02,
+- 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D,
+- 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02, 0x03, 0x23, 0x01, 0x57, 0x00, 0x02,
+- 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D,
+- 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C,
+- 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01,
+- 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69,
+- 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03,
+- 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23,
+- 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F,
+- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
+- 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08,
+- 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02,
+- 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F,
++ 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20,
++ 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E, 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07,
++ 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E,
++ 0x00, 0x34, 0x01, 0x24, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26,
++ 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23,
++ 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A,
++ 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C,
++ 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E,
++ 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02,
++ 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A,
++ 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C, 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07,
++ 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41,
++ 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02,
++ 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA,
++ 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30,
++ 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02,
++ 0x03, 0x44, 0x00, 0x01, 0x00, 0x04, 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E,
++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01,
++ 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02,
++ 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09,
++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42,
++ 0x00, 0x48, 0x01, 0x39, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23,
++ 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36,
++ 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D,
++ 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31, 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A,
++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02,
++ 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B,
++ 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42,
++ 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02,
++ 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47,
++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46, 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27,
++ 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02,
++ 0x03, 0x40, 0x01, 0x43, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78,
++ 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6,
++ 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2,
++ 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E,
++ 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62,
++ 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0,
++ 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8,
++ 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00,
++ 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03,
++ 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03,
++ 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03,
++ 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04,
++ 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04,
++ 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04,
++ 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30,
++ 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03,
++ 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09,
++ 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02, 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1,
++ 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11,
++ 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01,
++ 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09,
++ 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40,
++ 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8,
++ 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC,
++ 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02,
++ 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40,
++ 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03,
++ 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02,
++ 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26,
++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58,
++ 0x01, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58,
++ 0x00, 0x02, 0x03, 0x07, 0x01, 0x58, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F,
++ 0x02, 0x12, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A,
++ 0x00, 0x02, 0x03, 0x23, 0x01, 0x56, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31,
++ 0x01, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30,
++ 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66,
++ 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01,
++ 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60,
++ 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02,
++ 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23,
++ 0x02, 0x18, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03,
++ 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16,
++ 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07,
++ 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02,
++ 0x03, 0x26, 0x01, 0x62, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E,
+ 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78,
+ 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0,
+ 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE,
+ 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22,
+ 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E,
+ 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92,
+- 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9,
+- 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02,
+- 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03,
+- 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x69, 0x00, 0x02, 0x03, 0x03,
+- 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D,
+- 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03,
+- 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03,
+- 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03,
+- 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09,
+- 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71,
+- 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F,
+- 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9,
+- 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED,
+- 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB,
+- 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0,
+- 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02,
+- 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77,
+- 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40,
+- 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B,
+- 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06,
+- 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F, 0x00, 0x02, 0x03, 0x23, 0x00, 0x09,
+- 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E,
+- 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x01, 0x01, 0x75,
+- 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08,
+- 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02,
+- 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B,
+- 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20,
+- 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50,
+- 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00, 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01,
+- 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02, 0x03, 0x03, 0x02, 0x33, 0x00, 0x02,
+- 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7,
+- 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23,
+- 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10,
+- 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02,
+- 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E,
+- 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31,
+- 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22,
+- 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02,
+- 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC,
+- 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08,
+- 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04,
+- 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02,
+- 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C,
+- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09,
+- 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E,
+- 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01,
+- 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C,
+- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09,
+- 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C,
+- 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08,
+- 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04,
+- 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02,
+- 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02,
+- 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E,
+- 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00,
+- 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02,
+- 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07,
+- 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7,
+- 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03,
+- 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02,
+- 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02,
+- 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB,
+- 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02,
+- 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34,
+- 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02,
+- 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1,
+- 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04,
+- 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B,
+- 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34,
+- 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02,
+- 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3,
+- 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12,
+- 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02,
+- 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D,
+- 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02,
+- 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9,
+- 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26,
+- 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6,
+- 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40,
+- 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22,
+- 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02,
+- 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6,
+- 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34,
+- 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02,
+- 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1,
+- 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08,
+- 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x27, 0x00, 0x04,
+- 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00,
+- 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02,
+- 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04,
+- 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
+- 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52, 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC,
+- 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41,
+- 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02,
+- 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51,
+- 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64,
+- 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01,
+- 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02,
+- 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01,
+- 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08,
+- 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B,
+- 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08,
+- 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B,
+- 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28,
+- 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01,
+- 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02,
+- 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07,
+- 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD,
+- 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03,
+- 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02,
+- 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C,
+- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8,
+- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09,
+- 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02,
++ 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8,
++ 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02,
++ 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03,
++ 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03,
++ 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C,
++ 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03,
++ 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03,
++ 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03,
++ 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09,
++ 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70,
++ 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F,
++ 0x02, 0x16, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF,
++ 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02,
++ 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02, 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76,
++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40,
++ 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B,
++ 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06,
++ 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08,
++ 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C,
++ 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02,
++ 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88,
++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02,
++ 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36,
++ 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00,
++ 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02,
++ 0x03, 0x03, 0x02, 0x32, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78,
++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23,
++ 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10,
++ 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02,
++ 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D,
++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31,
++ 0x01, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62,
++ 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E,
++ 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC,
++ 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14,
++ 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48,
++ 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01,
++ 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01,
++ 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09,
++ 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40,
++ 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3,
++ 0x00, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06,
++ 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06,
++ 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06,
++ 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06,
++ 0x03, 0x41, 0x01, 0x03, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04,
++ 0x02, 0x27, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4,
++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A,
++ 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A,
++ 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02,
++ 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23,
++ 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05,
++ 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05,
++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E,
++ 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54,
++ 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09,
++ 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C,
++ 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41,
++ 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07,
++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26,
++ 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D,
++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D,
++ 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58,
++ 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94,
++ 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE,
++ 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02,
++ 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00,
++ 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1,
++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA,
++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04,
++ 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04,
++ 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04,
++ 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17,
++ 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09,
++ 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02,
++ 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23,
++ 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19,
++ 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30,
++ 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04,
++ 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24,
++ 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D,
++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06,
++ 0x01, 0x21, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02,
++ 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
++ 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02,
++ 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02,
++ 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B,
++ 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96, 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E,
++ 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62,
++ 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92,
++ 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE,
++ 0x00, 0x02, 0x03, 0x02, 0x01, 0x29, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04,
++ 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F,
++ 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02,
++ 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B,
++ 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28,
++ 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02,
++ 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35,
++ 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14,
++ 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9,
++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33, 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27,
++ 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14,
++ 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48,
++ 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E,
++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02,
++ 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B,
++ 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10,
++ 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07,
++ 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18,
++ 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48,
++ 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01,
++ 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02,
++ 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02, 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B,
++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40,
++ 0x01, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80,
++ 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE,
++ 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA,
++ 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34,
++ 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68,
++ 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6,
++ 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0,
++ 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB,
++ 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03,
++ 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03,
++ 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03,
++ 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03,
++ 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03,
++ 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03,
++ 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03,
++ 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00,
++ 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28,
++ 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41,
++ 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03,
++ 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08,
++ 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B,
++ 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09, 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02,
++ 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB,
++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03,
++ 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02,
++ 0x03, 0x23, 0x01, 0xED, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28,
++ 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB,
++ 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08,
++ 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07,
++ 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C,
++ 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55,
++ 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02,
++ 0x03, 0x07, 0x01, 0x59, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13,
++ 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02,
++ 0x03, 0x23, 0x01, 0x57, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55,
++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38,
++ 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E,
++ 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D,
++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02,
++ 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C,
++ 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19,
++ 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41,
++ 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
++ 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07,
++ 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08, 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02,
++ 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02, 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71,
++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64,
++ 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C,
++ 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8,
++ 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C,
++ 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A,
++ 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E,
++ 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9,
++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02,
++ 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01,
++ 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41,
++ 0x01, 0x69, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B,
++ 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08,
++ 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08,
++ 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08,
++ 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08,
++ 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F,
++ 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C,
++ 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03,
++ 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03,
++ 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03,
++ 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03,
++ 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23,
++ 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73,
++ 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30,
++ 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9,
++ 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02,
++ 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F,
++ 0x00, 0x02, 0x03, 0x23, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C,
++ 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83,
++ 0x00, 0x02, 0x03, 0x01, 0x01, 0x75, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07,
++ 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02,
++ 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02,
++ 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08,
++ 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E,
++ 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00,
++ 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02,
++ 0x03, 0x03, 0x02, 0x33, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF,
++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7, 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A,
++ 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02,
+ 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E,
+- 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF,
+- 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23,
+- 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04,
+- 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04,
+- 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0,
+- 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01,
+- 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02,
+- 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04,
+- 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C,
+- 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39,
+- 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01,
+- 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02,
+- 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04,
+- 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02,
+- 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7,
+- 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x02, 0x00, 0x01,
+- 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8,
+- 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04,
+- 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B,
+- 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1,
+- 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01,
+- 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A,
+- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02,
+- 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34,
+- 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x89,
+- 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48,
+- 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50,
+- 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59,
+- 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67,
+- 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F,
+- 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78,
+- 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA,
+- 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9,
+- 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA,
+- 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9,
+- 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06, 0x01, 0x07, 0x01, 0x12, 0x01, 0x13,
+- 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61,
+- 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F, 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF,
+- 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29,
+- 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60,
+- 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1, 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC,
+- 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A,
+- 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14, 0x13, 0x92, 0x1A, 0xA8, 0x1E, 0x46,
+- 0x21, 0xB8, 0x22, 0x76, 0x23, 0x04, 0x00, 0x01, 0x0F, 0x96, 0x01, 0xF2, 0x03, 0xEA, 0x03, 0xF0,
+- 0x03, 0xF6, 0x03, 0xFC, 0x04, 0x02, 0x04, 0x08, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20,
+- 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x4A, 0x04, 0x50,
+- 0x04, 0x56, 0x04, 0x5C, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80,
+- 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0,
+- 0x04, 0xB6, 0x04, 0xBC, 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0,
+- 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10,
+- 0x05, 0x16, 0x05, 0x1C, 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40,
+- 0x05, 0x46, 0x05, 0x4C, 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70,
+- 0x05, 0x76, 0x05, 0x7C, 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0,
+- 0x05, 0xA6, 0x05, 0xAC, 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0,
+- 0x05, 0xD6, 0x05, 0xDC, 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00,
+- 0x06, 0x06, 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30,
+- 0x06, 0x36, 0x06, 0x3C, 0x06, 0x42, 0x06, 0x48, 0x06, 0x4E, 0x06, 0x54, 0x06, 0x5A, 0x06, 0x60,
+- 0x06, 0x66, 0x06, 0x6C, 0x06, 0x72, 0x06, 0x78, 0x06, 0x7E, 0x06, 0x84, 0x06, 0x8A, 0x06, 0x90,
+- 0x06, 0x96, 0x06, 0x9C, 0x06, 0xA2, 0x06, 0xA8, 0x06, 0xAE, 0x06, 0xB4, 0x06, 0xBA, 0x06, 0xC0,
+- 0x06, 0xC6, 0x06, 0xCC, 0x06, 0xD2, 0x06, 0xD8, 0x06, 0xDE, 0x06, 0xE4, 0x06, 0xEA, 0x06, 0xF0,
+- 0x06, 0xF6, 0x06, 0xFC, 0x07, 0x02, 0x07, 0x08, 0x07, 0x0E, 0x07, 0x14, 0x07, 0x1A, 0x07, 0x20,
+- 0x07, 0x26, 0x07, 0x2C, 0x07, 0x32, 0x07, 0x38, 0x07, 0x3E, 0x07, 0x44, 0x07, 0x4A, 0x07, 0x50,
+- 0x07, 0x56, 0x07, 0x5C, 0x07, 0x62, 0x07, 0x68, 0x07, 0x6E, 0x07, 0x74, 0x07, 0x7A, 0x07, 0x80,
+- 0x07, 0x86, 0x07, 0x8C, 0x07, 0x92, 0x07, 0x98, 0x07, 0x9E, 0x07, 0xA4, 0x07, 0xAA, 0x07, 0xB0,
+- 0x07, 0xB6, 0x07, 0xBC, 0x07, 0xC2, 0x07, 0xC8, 0x07, 0xCE, 0x07, 0xD4, 0x07, 0xDA, 0x07, 0xE0,
+- 0x07, 0xE6, 0x07, 0xEC, 0x07, 0xF2, 0x07, 0xF8, 0x07, 0xFE, 0x08, 0x04, 0x08, 0x0A, 0x08, 0x10,
+- 0x08, 0x16, 0x08, 0x1C, 0x08, 0x22, 0x08, 0x28, 0x08, 0x2E, 0x08, 0x34, 0x08, 0x3A, 0x08, 0x40,
+- 0x08, 0x46, 0x08, 0x4C, 0x08, 0x52, 0x08, 0x58, 0x08, 0x5E, 0x08, 0x64, 0x08, 0x6A, 0x08, 0x70,
+- 0x08, 0x76, 0x08, 0x7C, 0x08, 0x82, 0x08, 0x88, 0x08, 0x8E, 0x08, 0x94, 0x08, 0x9A, 0x08, 0xA0,
+- 0x08, 0xA6, 0x08, 0xAC, 0x08, 0xB2, 0x08, 0xB8, 0x08, 0xBE, 0x08, 0xC4, 0x08, 0xCA, 0x08, 0xD0,
+- 0x08, 0xD6, 0x08, 0xDC, 0x08, 0xE2, 0x08, 0xE8, 0x08, 0xEE, 0x08, 0xF4, 0x08, 0xFA, 0x09, 0x00,
+- 0x09, 0x06, 0x09, 0x0C, 0x09, 0x12, 0x09, 0x18, 0x09, 0x1E, 0x09, 0x24, 0x09, 0x2A, 0x09, 0x30,
+- 0x09, 0x36, 0x09, 0x3C, 0x09, 0x42, 0x09, 0x48, 0x09, 0x4E, 0x09, 0x54, 0x09, 0x5A, 0x09, 0x60,
+- 0x09, 0x66, 0x09, 0x6C, 0x09, 0x72, 0x09, 0x78, 0x09, 0x7E, 0x09, 0x84, 0x09, 0x8A, 0x09, 0x90,
+- 0x09, 0x96, 0x09, 0x9C, 0x09, 0xA2, 0x09, 0xA8, 0x09, 0xAE, 0x09, 0xB4, 0x09, 0xBA, 0x09, 0xC0,
+- 0x09, 0xC6, 0x09, 0xCC, 0x09, 0xD2, 0x09, 0xD8, 0x09, 0xDE, 0x09, 0xE4, 0x09, 0xEA, 0x09, 0xF0,
+- 0x09, 0xF6, 0x09, 0xFC, 0x0A, 0x02, 0x0A, 0x08, 0x0A, 0x0E, 0x0A, 0x14, 0x0A, 0x1A, 0x0A, 0x20,
+- 0x0A, 0x26, 0x0A, 0x2C, 0x0A, 0x32, 0x0A, 0x38, 0x0A, 0x3E, 0x0A, 0x44, 0x0A, 0x4A, 0x0A, 0x50,
+- 0x0A, 0x56, 0x0A, 0x5C, 0x0A, 0x62, 0x0A, 0x68, 0x0A, 0x6E, 0x0A, 0x74, 0x0A, 0x7A, 0x0A, 0x80,
+- 0x0A, 0x86, 0x0A, 0x8C, 0x0A, 0x92, 0x0A, 0x98, 0x0A, 0x9E, 0x0A, 0xA4, 0x0A, 0xAA, 0x0A, 0xB0,
+- 0x0A, 0xB6, 0x0A, 0xBC, 0x0A, 0xC2, 0x0A, 0xC8, 0x0A, 0xCE, 0x0A, 0xD4, 0x0A, 0xDA, 0x0A, 0xE0,
+- 0x0A, 0xE6, 0x0A, 0xEC, 0x0A, 0xF2, 0x0A, 0xF8, 0x0A, 0xFE, 0x0B, 0x04, 0x0B, 0x0A, 0x0B, 0x10,
+- 0x0B, 0x16, 0x0B, 0x1C, 0x0B, 0x22, 0x0B, 0x28, 0x0B, 0x2E, 0x0B, 0x34, 0x0B, 0x3A, 0x0B, 0x40,
+- 0x0B, 0x46, 0x0B, 0x4C, 0x0B, 0x52, 0x0B, 0x58, 0x0B, 0x5E, 0x0B, 0x64, 0x0B, 0x6A, 0x0B, 0x70,
+- 0x0B, 0x76, 0x0B, 0x7C, 0x0B, 0x82, 0x0B, 0x88, 0x0B, 0x8E, 0x0B, 0x94, 0x0B, 0x9A, 0x0B, 0xA0,
+- 0x0B, 0xA6, 0x0B, 0xAC, 0x0B, 0xB2, 0x0B, 0xB8, 0x0B, 0xBE, 0x0B, 0xC4, 0x0B, 0xCA, 0x0B, 0xD0,
+- 0x0B, 0xD6, 0x0B, 0xDC, 0x0B, 0xE2, 0x0B, 0xE8, 0x0B, 0xEE, 0x0B, 0xF4, 0x0B, 0xFA, 0x0C, 0x00,
+- 0x0C, 0x06, 0x0C, 0x0C, 0x0C, 0x12, 0x0C, 0x18, 0x0C, 0x1E, 0x0C, 0x24, 0x0C, 0x2A, 0x0C, 0x30,
+- 0x0C, 0x36, 0x0C, 0x3C, 0x0C, 0x42, 0x0C, 0x48, 0x0C, 0x4E, 0x0C, 0x54, 0x0C, 0x5A, 0x0C, 0x60,
+- 0x0C, 0x66, 0x0C, 0x6C, 0x0C, 0x72, 0x0C, 0x78, 0x0C, 0x7E, 0x0C, 0x84, 0x0C, 0x8A, 0x0C, 0x90,
+- 0x0C, 0x96, 0x0C, 0x9C, 0x0C, 0xA2, 0x0C, 0xA8, 0x0C, 0xAE, 0x0C, 0xB4, 0x0C, 0xBA, 0x0C, 0xC0,
+- 0x0C, 0xC6, 0x0C, 0xCC, 0x0C, 0xD2, 0x0C, 0xD8, 0x0C, 0xDE, 0x0C, 0xE4, 0x0C, 0xEA, 0x0C, 0xF0,
+- 0x0C, 0xF6, 0x0C, 0xFC, 0x0D, 0x02, 0x0D, 0x08, 0x0D, 0x0E, 0x0D, 0x14, 0x0D, 0x1A, 0x0D, 0x20,
+- 0x0D, 0x26, 0x0D, 0x2C, 0x0D, 0x32, 0x0D, 0x38, 0x0D, 0x3E, 0x0D, 0x44, 0x0D, 0x4A, 0x0D, 0x50,
+- 0x0D, 0x56, 0x0D, 0x5C, 0x0D, 0x62, 0x0D, 0x68, 0x0D, 0x6E, 0x0D, 0x74, 0x0D, 0x7A, 0x0D, 0x80,
+- 0x0D, 0x86, 0x0D, 0x8C, 0x0D, 0x92, 0x0D, 0x98, 0x0D, 0x9E, 0x0D, 0xA4, 0x0D, 0xAA, 0x0D, 0xB0,
+- 0x0D, 0xB6, 0x0D, 0xBC, 0x0D, 0xC2, 0x0D, 0xC8, 0x0D, 0xCE, 0x0D, 0xD4, 0x0D, 0xDA, 0x0D, 0xE0,
+- 0x0D, 0xE6, 0x0D, 0xEC, 0x0D, 0xF2, 0x0D, 0xF8, 0x0D, 0xFE, 0x0E, 0x04, 0x0E, 0x0A, 0x0E, 0x10,
+- 0x0E, 0x16, 0x0E, 0x1C, 0x0E, 0x22, 0x0E, 0x28, 0x0E, 0x2E, 0x0E, 0x34, 0x0E, 0x3A, 0x0E, 0x40,
+- 0x0E, 0x46, 0x0E, 0x4C, 0x0E, 0x52, 0x0E, 0x58, 0x0E, 0x5E, 0x0E, 0x64, 0x0E, 0x6A, 0x0E, 0x70,
+- 0x0E, 0x76, 0x0E, 0x7C, 0x0E, 0x82, 0x0E, 0x88, 0x0E, 0x8E, 0x0E, 0x94, 0x0E, 0x9A, 0x0E, 0xA0,
+- 0x0E, 0xA6, 0x0E, 0xAC, 0x0E, 0xB2, 0x0E, 0xB8, 0x0E, 0xBE, 0x0E, 0xC4, 0x0E, 0xCA, 0x0E, 0xD0,
+- 0x0E, 0xD6, 0x0E, 0xDC, 0x0E, 0xE2, 0x0E, 0xE8, 0x0E, 0xEE, 0x0E, 0xF4, 0x0E, 0xFA, 0x0F, 0x00,
+- 0x0F, 0x06, 0x0F, 0x0C, 0x0F, 0x12, 0x0F, 0x18, 0x0F, 0x1E, 0x0F, 0x24, 0x0F, 0x2A, 0x0F, 0x30,
+- 0x0F, 0x36, 0x0F, 0x3C, 0x0F, 0x42, 0x0F, 0x48, 0x0F, 0x4E, 0x0F, 0x54, 0x0F, 0x5A, 0x0F, 0x60,
+- 0x0F, 0x66, 0x0F, 0x6C, 0x0F, 0x72, 0x0F, 0x78, 0x0F, 0x7E, 0x0F, 0x84, 0x0F, 0x8A, 0x0F, 0x90,
+- 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41,
+- 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, 0x03, 0x08, 0x00, 0x02,
+- 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02, 0x00, 0x45, 0x03, 0x00,
+- 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02, 0x00, 0x02, 0x00, 0x45,
+- 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x03,
+- 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4F,
+- 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x08, 0x00, 0x02,
+- 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02, 0x00, 0x55, 0x03, 0x02,
+- 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61,
+- 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, 0x03, 0x02, 0x00, 0x02,
+- 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0A,
+- 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00, 0x00, 0x02, 0x00, 0x65,
+- 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65, 0x03, 0x08, 0x00, 0x02,
+- 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02, 0x00, 0x69, 0x03, 0x02,
+- 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F,
+- 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x02, 0x00, 0x02,
+- 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02, 0x00, 0x75, 0x03, 0x00,
+- 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02, 0x00, 0x02, 0x00, 0x75,
+- 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79, 0x03, 0x08, 0x00, 0x02,
+- 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, 0x03, 0x06,
+- 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28, 0x00, 0x02, 0x00, 0x61,
+- 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02, 0x00, 0x43, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x63,
+- 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02, 0x00, 0x45, 0x03, 0x06,
+- 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07, 0x00, 0x02, 0x00, 0x65,
+- 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65, 0x03, 0x28, 0x00, 0x02,
+- 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x02,
+- 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06, 0x00, 0x02, 0x00, 0x67,
+- 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67, 0x03, 0x07, 0x00, 0x02,
+- 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x02,
+- 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03, 0x00, 0x02, 0x00, 0x69,
+- 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69, 0x03, 0x04, 0x00, 0x02,
+- 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02, 0x00, 0x49, 0x03, 0x28,
+- 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4A,
+- 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x27, 0x00, 0x02,
+- 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C,
+- 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x27,
+- 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F,
+- 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x06, 0x00, 0x02,
+- 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0B,
+- 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01, 0x00, 0x02, 0x00, 0x52,
+- 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02, 0x00, 0x73, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02, 0x00, 0x02, 0x00, 0x53,
+- 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02, 0x00, 0x74, 0x03, 0x27,
+- 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55,
+- 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55, 0x03, 0x04, 0x00, 0x02,
+- 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02, 0x00, 0x75, 0x03, 0x06,
+- 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x55,
+- 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x28, 0x00, 0x02,
+- 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02, 0x00, 0x77, 0x03, 0x02,
+- 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59,
+- 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x0C,
+- 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x6F,
+- 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x1B, 0x00, 0x02,
+- 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0C,
+- 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6F,
+- 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x44,
+- 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xFC,
+- 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x02,
+- 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02, 0x02, 0x26, 0x03, 0x04,
+- 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE6,
+- 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x28,
+- 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4D,
+- 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02, 0x00, 0x67, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00, 0x00, 0x02, 0x00, 0xC5,
+- 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF8, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x41,
+- 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0F, 0x00, 0x02,
+- 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02, 0x00, 0x65, 0x03, 0x11,
+- 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x49,
+- 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0F, 0x00, 0x02,
+- 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x11,
+- 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x52,
+- 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0F, 0x00, 0x02,
+- 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02, 0x00, 0x75, 0x03, 0x11,
+- 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26, 0x00, 0x02, 0x00, 0x54,
+- 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48, 0x03, 0x0C, 0x00, 0x02,
+- 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02, 0x00, 0x61, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27, 0x00, 0x02, 0x00, 0xD6,
+- 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x04, 0x00, 0x02,
+- 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x07,
+- 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x59,
+- 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, 0x03, 0x25, 0x00, 0x02,
+- 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02, 0x00, 0x62, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23, 0x00, 0x02, 0x00, 0x42,
+- 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02, 0x00, 0x64, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23, 0x00, 0x02, 0x00, 0x44,
+- 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44, 0x03, 0x27, 0x00, 0x02,
+- 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x64, 0x03, 0x2D,
+- 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00, 0x00, 0x02, 0x01, 0x12,
+- 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x2D, 0x00, 0x02,
+- 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02, 0x00, 0x65, 0x03, 0x30,
+- 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27, 0x00, 0x02, 0x00, 0x46,
+- 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x04, 0x00, 0x02,
+- 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02, 0x00, 0x68, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23, 0x00, 0x02, 0x00, 0x48,
+- 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48, 0x03, 0x27, 0x00, 0x02,
+- 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x68, 0x03, 0x2E,
+- 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30, 0x00, 0x02, 0x00, 0x49,
+- 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x23,
+- 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C,
+- 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36, 0x03, 0x04, 0x00, 0x02,
+- 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x31,
+- 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x4D,
+- 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x07, 0x00, 0x02,
+- 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x23,
+- 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4E,
+- 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x31, 0x00, 0x02,
+- 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x2D,
+- 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD5,
+- 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x00, 0x00, 0x02,
+- 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50,
+- 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x07, 0x00, 0x02,
+- 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02, 0x00, 0x72, 0x03, 0x23,
+- 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04, 0x00, 0x02, 0x00, 0x52,
+- 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53, 0x03, 0x07, 0x00, 0x02,
+- 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02, 0x00, 0x73, 0x03, 0x23,
+- 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07, 0x00, 0x02, 0x01, 0x60,
+- 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60, 0x03, 0x23, 0x00, 0x02,
+- 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02, 0x00, 0x74, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54,
+- 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54, 0x03, 0x2D, 0x00, 0x02,
+- 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02, 0x00, 0x75, 0x03, 0x24,
+- 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30, 0x00, 0x02, 0x00, 0x55,
+- 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68, 0x03, 0x01, 0x00, 0x02,
+- 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02, 0x01, 0x6B, 0x03, 0x08,
+- 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03, 0x00, 0x02, 0x00, 0x56,
+- 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57, 0x03, 0x00, 0x00, 0x02,
+- 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02, 0x00, 0x77, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08, 0x00, 0x02, 0x00, 0x57,
+- 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57, 0x03, 0x23, 0x00, 0x02,
+- 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02, 0x00, 0x78, 0x03, 0x07,
+- 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59,
+- 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x02, 0x00, 0x02,
+- 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x23,
+- 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x68,
+- 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x0A, 0x00, 0x02,
+- 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02, 0x00, 0x41, 0x03, 0x23,
+- 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09, 0x00, 0x02, 0x00, 0x61,
+- 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x01, 0x00, 0x02,
+- 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x09,
+- 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xE2,
+- 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x23, 0x00, 0x02,
+- 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02, 0x01, 0x02, 0x03, 0x00,
+- 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09, 0x00, 0x02, 0x01, 0x03,
+- 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, 0x00, 0x02,
+- 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x23,
+- 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09, 0x00, 0x02, 0x00, 0x65,
+- 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65, 0x03, 0x03, 0x00, 0x02,
+- 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x00,
+- 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xEA,
+- 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x03, 0x00, 0x02,
+- 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02, 0x00, 0x49, 0x03, 0x09,
+- 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23, 0x00, 0x02, 0x00, 0x69,
+- 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x23, 0x00, 0x02,
+- 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xF4,
+- 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x09, 0x00, 0x02,
+- 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x23,
+- 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF3,
+- 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2, 0x03, 0x1B, 0x00, 0x02,
+- 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x1B,
+- 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23, 0x00, 0x02, 0x01, 0xA1,
+- 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75, 0x03, 0x23, 0x00, 0x02,
+- 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02, 0x00, 0xDA, 0x03, 0x1B,
+- 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF9,
+- 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x09, 0x00, 0x02,
+- 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x23,
+- 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00, 0x00, 0x02, 0x00, 0x79,
+- 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79, 0x03, 0x23, 0x00, 0x02,
+- 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02, 0x00, 0x59, 0x03, 0x03,
+- 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x01, 0x01, 0xF2,
+- 0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8,
+- 0x00, 0xC9, 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1,
+- 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB,
+- 0x00, 0xDC, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5,
+- 0x00, 0xE7, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE,
+- 0x00, 0xEF, 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9,
+- 0x00, 0xFA, 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02,
+- 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A,
+- 0x01, 0x0B, 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14,
+- 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C,
+- 0x01, 0x1D, 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24,
+- 0x01, 0x25, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E,
+- 0x01, 0x2F, 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A,
+- 0x01, 0x3B, 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46,
+- 0x01, 0x47, 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51,
+- 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B,
+- 0x01, 0x5C, 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63,
+- 0x01, 0x64, 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D,
+- 0x01, 0x6E, 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75,
+- 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D,
+- 0x01, 0x7E, 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF,
+- 0x01, 0xD0, 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7,
+- 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0,
+- 0x01, 0xE1, 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA,
+- 0x01, 0xEB, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5,
+- 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF,
+- 0x02, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07,
+- 0x02, 0x08, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F,
+- 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17,
+- 0x02, 0x18, 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27,
+- 0x02, 0x28, 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F,
+- 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03,
+- 0x1E, 0x04, 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B,
+- 0x1E, 0x0C, 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13,
+- 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B,
+- 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23,
+- 0x1E, 0x24, 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B,
+- 0x1E, 0x2C, 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33,
+- 0x1E, 0x34, 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B,
+- 0x1E, 0x3C, 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43,
+- 0x1E, 0x44, 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B,
+- 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53,
+- 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B,
+- 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63,
+- 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B,
+- 0x1E, 0x6C, 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73,
+- 0x1E, 0x74, 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B,
+- 0x1E, 0x7C, 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83,
+- 0x1E, 0x84, 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B,
+- 0x1E, 0x8C, 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93,
+- 0x1E, 0x94, 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0,
+- 0x1E, 0xA1, 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8,
+- 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0,
+- 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8,
+- 0x1E, 0xB9, 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0,
+- 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8,
+- 0x1E, 0xC9, 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0,
+- 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8,
+- 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0,
+- 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8,
++ 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C,
++ 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23,
++ 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10,
++ 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02,
++ 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8,
++ 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40,
++ 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04,
++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01,
++ 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06,
++ 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07,
++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0,
++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03,
++ 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02,
++ 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E,
++ 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC,
++ 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07,
++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2,
++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03,
++ 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02,
++ 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18,
++ 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04,
++ 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06,
++ 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01,
++ 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02,
++ 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C,
++ 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02,
++ 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7,
++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28,
++ 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01,
++ 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02,
++ 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01,
++ 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB,
++ 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E,
++ 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD,
++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01,
++ 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22,
++ 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02,
++ 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7,
++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04,
++ 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22,
++ 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02,
++ 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9,
++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02,
++ 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1,
++ 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B,
++ 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01,
++ 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B,
++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14,
++ 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8,
++ 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C,
++ 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10,
++ 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02,
++ 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2,
++ 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40,
++ 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22,
++ 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02,
++ 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7,
++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09,
++ 0x00, 0x02, 0x03, 0x27, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14,
++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40,
++ 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C,
++ 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02,
++ 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02,
++ 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C,
++ 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52,
++ 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40,
++ 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E,
++ 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED,
++ 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65,
++ 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01,
++ 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02, 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14,
++ 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01,
++ 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04,
++ 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08,
++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B, 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16,
++ 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00,
++ 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02,
++ 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA,
++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28,
++ 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01,
++ 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02,
++ 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07,
++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA,
++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03,
++ 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02,
++ 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C,
++ 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9,
++ 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09,
++ 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04,
++ 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04,
++ 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1,
++ 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01,
++ 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02,
++ 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04,
++ 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04,
++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C,
++ 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01,
++ 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02,
++ 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04,
++ 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02,
++ 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD,
++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6,
++ 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02,
++ 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B,
++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02,
++ 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04,
++ 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B,
++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC,
++ 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06,
++ 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02,
++ 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36,
++ 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02,
++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x89, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45,
++ 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D,
++ 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56,
++ 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64,
++ 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C,
++ 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75,
++ 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5,
++ 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA, 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5,
++ 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5,
++ 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA, 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5,
++ 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06,
++ 0x01, 0x07, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A,
++ 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F,
++ 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26,
++ 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37,
++ 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1,
++ 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5,
++ 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A, 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14,
++ 0x13, 0x88, 0x1A, 0x9E, 0x1E, 0x3C, 0x21, 0xAE, 0x22, 0x6C, 0x22, 0xFA, 0x00, 0x01, 0x0F, 0x8E,
++ 0x01, 0xF1, 0x03, 0xE8, 0x03, 0xEE, 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C,
++ 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, 0x04, 0x24, 0x04, 0x2A, 0x04, 0x30, 0x04, 0x36, 0x04, 0x3C,
++ 0x04, 0x42, 0x04, 0x48, 0x04, 0x4E, 0x04, 0x54, 0x04, 0x5A, 0x04, 0x60, 0x04, 0x66, 0x04, 0x6C,
++ 0x04, 0x72, 0x04, 0x78, 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8A, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9C,
++ 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCC,
++ 0x04, 0xD2, 0x04, 0xD8, 0x04, 0xDE, 0x04, 0xE4, 0x04, 0xEA, 0x04, 0xF0, 0x04, 0xF6, 0x04, 0xFC,
++ 0x05, 0x02, 0x05, 0x08, 0x05, 0x0E, 0x05, 0x14, 0x05, 0x1A, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2C,
++ 0x05, 0x32, 0x05, 0x38, 0x05, 0x3E, 0x05, 0x44, 0x05, 0x4A, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5C,
++ 0x05, 0x62, 0x05, 0x68, 0x05, 0x6E, 0x05, 0x74, 0x05, 0x7A, 0x05, 0x80, 0x05, 0x86, 0x05, 0x8C,
++ 0x05, 0x92, 0x05, 0x98, 0x05, 0x9E, 0x05, 0xA4, 0x05, 0xAA, 0x05, 0xB0, 0x05, 0xB6, 0x05, 0xBC,
++ 0x05, 0xC2, 0x05, 0xC8, 0x05, 0xCE, 0x05, 0xD4, 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC,
++ 0x05, 0xF2, 0x05, 0xF8, 0x05, 0xFE, 0x06, 0x04, 0x06, 0x0A, 0x06, 0x10, 0x06, 0x16, 0x06, 0x1C,
++ 0x06, 0x22, 0x06, 0x28, 0x06, 0x2E, 0x06, 0x34, 0x06, 0x3A, 0x06, 0x40, 0x06, 0x46, 0x06, 0x4C,
++ 0x06, 0x52, 0x06, 0x58, 0x06, 0x5E, 0x06, 0x64, 0x06, 0x6A, 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C,
++ 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A, 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC,
++ 0x06, 0xB2, 0x06, 0xB8, 0x06, 0xBE, 0x06, 0xC4, 0x06, 0xCA, 0x06, 0xD0, 0x06, 0xD6, 0x06, 0xDC,
++ 0x06, 0xE2, 0x06, 0xE8, 0x06, 0xEE, 0x06, 0xF4, 0x06, 0xFA, 0x07, 0x00, 0x07, 0x06, 0x07, 0x0C,
++ 0x07, 0x12, 0x07, 0x18, 0x07, 0x1E, 0x07, 0x24, 0x07, 0x2A, 0x07, 0x30, 0x07, 0x36, 0x07, 0x3C,
++ 0x07, 0x42, 0x07, 0x48, 0x07, 0x4E, 0x07, 0x54, 0x07, 0x5A, 0x07, 0x60, 0x07, 0x66, 0x07, 0x6C,
++ 0x07, 0x72, 0x07, 0x78, 0x07, 0x7E, 0x07, 0x84, 0x07, 0x8A, 0x07, 0x90, 0x07, 0x96, 0x07, 0x9C,
++ 0x07, 0xA2, 0x07, 0xA8, 0x07, 0xAE, 0x07, 0xB4, 0x07, 0xBA, 0x07, 0xC0, 0x07, 0xC6, 0x07, 0xCC,
++ 0x07, 0xD2, 0x07, 0xD8, 0x07, 0xDE, 0x07, 0xE4, 0x07, 0xEA, 0x07, 0xF0, 0x07, 0xF6, 0x07, 0xFC,
++ 0x08, 0x02, 0x08, 0x08, 0x08, 0x0E, 0x08, 0x14, 0x08, 0x1A, 0x08, 0x20, 0x08, 0x26, 0x08, 0x2C,
++ 0x08, 0x32, 0x08, 0x38, 0x08, 0x3E, 0x08, 0x44, 0x08, 0x4A, 0x08, 0x50, 0x08, 0x56, 0x08, 0x5C,
++ 0x08, 0x62, 0x08, 0x68, 0x08, 0x6E, 0x08, 0x74, 0x08, 0x7A, 0x08, 0x80, 0x08, 0x86, 0x08, 0x8C,
++ 0x08, 0x92, 0x08, 0x98, 0x08, 0x9E, 0x08, 0xA4, 0x08, 0xAA, 0x08, 0xB0, 0x08, 0xB6, 0x08, 0xBC,
++ 0x08, 0xC2, 0x08, 0xC8, 0x08, 0xCE, 0x08, 0xD4, 0x08, 0xDA, 0x08, 0xE0, 0x08, 0xE6, 0x08, 0xEC,
++ 0x08, 0xF2, 0x08, 0xF8, 0x08, 0xFE, 0x09, 0x04, 0x09, 0x0A, 0x09, 0x10, 0x09, 0x16, 0x09, 0x1C,
++ 0x09, 0x22, 0x09, 0x28, 0x09, 0x2E, 0x09, 0x34, 0x09, 0x3A, 0x09, 0x40, 0x09, 0x46, 0x09, 0x4C,
++ 0x09, 0x52, 0x09, 0x58, 0x09, 0x5E, 0x09, 0x64, 0x09, 0x6A, 0x09, 0x70, 0x09, 0x76, 0x09, 0x7C,
++ 0x09, 0x82, 0x09, 0x88, 0x09, 0x8E, 0x09, 0x94, 0x09, 0x9A, 0x09, 0xA0, 0x09, 0xA6, 0x09, 0xAC,
++ 0x09, 0xB2, 0x09, 0xB8, 0x09, 0xBE, 0x09, 0xC4, 0x09, 0xCA, 0x09, 0xD0, 0x09, 0xD6, 0x09, 0xDC,
++ 0x09, 0xE2, 0x09, 0xE8, 0x09, 0xEE, 0x09, 0xF4, 0x09, 0xFA, 0x0A, 0x00, 0x0A, 0x06, 0x0A, 0x0C,
++ 0x0A, 0x12, 0x0A, 0x18, 0x0A, 0x1E, 0x0A, 0x24, 0x0A, 0x2A, 0x0A, 0x30, 0x0A, 0x36, 0x0A, 0x3C,
++ 0x0A, 0x42, 0x0A, 0x48, 0x0A, 0x4E, 0x0A, 0x54, 0x0A, 0x5A, 0x0A, 0x60, 0x0A, 0x66, 0x0A, 0x6C,
++ 0x0A, 0x72, 0x0A, 0x78, 0x0A, 0x7E, 0x0A, 0x84, 0x0A, 0x8A, 0x0A, 0x90, 0x0A, 0x96, 0x0A, 0x9C,
++ 0x0A, 0xA2, 0x0A, 0xA8, 0x0A, 0xAE, 0x0A, 0xB4, 0x0A, 0xBA, 0x0A, 0xC0, 0x0A, 0xC6, 0x0A, 0xCC,
++ 0x0A, 0xD2, 0x0A, 0xD8, 0x0A, 0xDE, 0x0A, 0xE4, 0x0A, 0xEA, 0x0A, 0xF0, 0x0A, 0xF6, 0x0A, 0xFC,
++ 0x0B, 0x02, 0x0B, 0x08, 0x0B, 0x0E, 0x0B, 0x14, 0x0B, 0x1A, 0x0B, 0x20, 0x0B, 0x26, 0x0B, 0x2C,
++ 0x0B, 0x32, 0x0B, 0x38, 0x0B, 0x3E, 0x0B, 0x44, 0x0B, 0x4A, 0x0B, 0x50, 0x0B, 0x56, 0x0B, 0x5C,
++ 0x0B, 0x62, 0x0B, 0x68, 0x0B, 0x6E, 0x0B, 0x74, 0x0B, 0x7A, 0x0B, 0x80, 0x0B, 0x86, 0x0B, 0x8C,
++ 0x0B, 0x92, 0x0B, 0x98, 0x0B, 0x9E, 0x0B, 0xA4, 0x0B, 0xAA, 0x0B, 0xB0, 0x0B, 0xB6, 0x0B, 0xBC,
++ 0x0B, 0xC2, 0x0B, 0xC8, 0x0B, 0xCE, 0x0B, 0xD4, 0x0B, 0xDA, 0x0B, 0xE0, 0x0B, 0xE6, 0x0B, 0xEC,
++ 0x0B, 0xF2, 0x0B, 0xF8, 0x0B, 0xFE, 0x0C, 0x04, 0x0C, 0x0A, 0x0C, 0x10, 0x0C, 0x16, 0x0C, 0x1C,
++ 0x0C, 0x22, 0x0C, 0x28, 0x0C, 0x2E, 0x0C, 0x34, 0x0C, 0x3A, 0x0C, 0x40, 0x0C, 0x46, 0x0C, 0x4C,
++ 0x0C, 0x52, 0x0C, 0x58, 0x0C, 0x5E, 0x0C, 0x64, 0x0C, 0x6A, 0x0C, 0x70, 0x0C, 0x76, 0x0C, 0x7C,
++ 0x0C, 0x82, 0x0C, 0x88, 0x0C, 0x8E, 0x0C, 0x94, 0x0C, 0x9A, 0x0C, 0xA0, 0x0C, 0xA6, 0x0C, 0xAC,
++ 0x0C, 0xB2, 0x0C, 0xB8, 0x0C, 0xBE, 0x0C, 0xC4, 0x0C, 0xCA, 0x0C, 0xD0, 0x0C, 0xD6, 0x0C, 0xDC,
++ 0x0C, 0xE2, 0x0C, 0xE8, 0x0C, 0xEE, 0x0C, 0xF4, 0x0C, 0xFA, 0x0D, 0x00, 0x0D, 0x06, 0x0D, 0x0C,
++ 0x0D, 0x12, 0x0D, 0x18, 0x0D, 0x1E, 0x0D, 0x24, 0x0D, 0x2A, 0x0D, 0x30, 0x0D, 0x36, 0x0D, 0x3C,
++ 0x0D, 0x42, 0x0D, 0x48, 0x0D, 0x4E, 0x0D, 0x54, 0x0D, 0x5A, 0x0D, 0x60, 0x0D, 0x66, 0x0D, 0x6C,
++ 0x0D, 0x72, 0x0D, 0x78, 0x0D, 0x7E, 0x0D, 0x84, 0x0D, 0x8A, 0x0D, 0x90, 0x0D, 0x96, 0x0D, 0x9C,
++ 0x0D, 0xA2, 0x0D, 0xA8, 0x0D, 0xAE, 0x0D, 0xB4, 0x0D, 0xBA, 0x0D, 0xC0, 0x0D, 0xC6, 0x0D, 0xCC,
++ 0x0D, 0xD2, 0x0D, 0xD8, 0x0D, 0xDE, 0x0D, 0xE4, 0x0D, 0xEA, 0x0D, 0xF0, 0x0D, 0xF6, 0x0D, 0xFC,
++ 0x0E, 0x02, 0x0E, 0x08, 0x0E, 0x0E, 0x0E, 0x14, 0x0E, 0x1A, 0x0E, 0x20, 0x0E, 0x26, 0x0E, 0x2C,
++ 0x0E, 0x32, 0x0E, 0x38, 0x0E, 0x3E, 0x0E, 0x44, 0x0E, 0x4A, 0x0E, 0x50, 0x0E, 0x56, 0x0E, 0x5C,
++ 0x0E, 0x62, 0x0E, 0x68, 0x0E, 0x6E, 0x0E, 0x74, 0x0E, 0x7A, 0x0E, 0x80, 0x0E, 0x86, 0x0E, 0x8C,
++ 0x0E, 0x92, 0x0E, 0x98, 0x0E, 0x9E, 0x0E, 0xA4, 0x0E, 0xAA, 0x0E, 0xB0, 0x0E, 0xB6, 0x0E, 0xBC,
++ 0x0E, 0xC2, 0x0E, 0xC8, 0x0E, 0xCE, 0x0E, 0xD4, 0x0E, 0xDA, 0x0E, 0xE0, 0x0E, 0xE6, 0x0E, 0xEC,
++ 0x0E, 0xF2, 0x0E, 0xF8, 0x0E, 0xFE, 0x0F, 0x04, 0x0F, 0x0A, 0x0F, 0x10, 0x0F, 0x16, 0x0F, 0x1C,
++ 0x0F, 0x22, 0x0F, 0x28, 0x0F, 0x2E, 0x0F, 0x34, 0x0F, 0x3A, 0x0F, 0x40, 0x0F, 0x46, 0x0F, 0x4C,
++ 0x0F, 0x52, 0x0F, 0x58, 0x0F, 0x5E, 0x0F, 0x64, 0x0F, 0x6A, 0x0F, 0x70, 0x0F, 0x76, 0x0F, 0x7C,
++ 0x0F, 0x82, 0x0F, 0x88, 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01,
++ 0x00, 0x02, 0x00, 0x41, 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41,
++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02,
++ 0x00, 0x45, 0x03, 0x00, 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02,
++ 0x00, 0x02, 0x00, 0x45, 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02,
++ 0x00, 0x4E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01,
++ 0x00, 0x02, 0x00, 0x4F, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F,
++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0x55, 0x03, 0x02, 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01,
++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61,
++ 0x03, 0x02, 0x00, 0x02, 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02,
++ 0x00, 0x61, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00,
++ 0x00, 0x02, 0x00, 0x65, 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65,
++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0x69, 0x03, 0x02, 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03,
++ 0x00, 0x02, 0x00, 0x6F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F,
++ 0x03, 0x02, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02,
++ 0x00, 0x75, 0x03, 0x00, 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02,
++ 0x00, 0x02, 0x00, 0x75, 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79,
++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02,
++ 0x00, 0x41, 0x03, 0x06, 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28,
++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02,
++ 0x00, 0x43, 0x03, 0x07, 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C,
++ 0x00, 0x02, 0x00, 0x63, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02,
++ 0x00, 0x45, 0x03, 0x06, 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07,
++ 0x00, 0x02, 0x00, 0x65, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65,
++ 0x03, 0x28, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02,
++ 0x00, 0x47, 0x03, 0x02, 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06,
++ 0x00, 0x02, 0x00, 0x67, 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67,
++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02,
++ 0x00, 0x48, 0x03, 0x02, 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03,
++ 0x00, 0x02, 0x00, 0x69, 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69,
++ 0x03, 0x04, 0x00, 0x02, 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02,
++ 0x00, 0x49, 0x03, 0x28, 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07,
++ 0x00, 0x02, 0x00, 0x4A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B,
++ 0x03, 0x27, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0x6C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27,
++ 0x00, 0x02, 0x00, 0x4C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02,
++ 0x00, 0x6E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C,
++ 0x00, 0x02, 0x00, 0x4F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F,
++ 0x03, 0x06, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02,
++ 0x00, 0x6F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01,
++ 0x00, 0x02, 0x00, 0x52, 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0x73, 0x03, 0x01, 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02,
++ 0x00, 0x02, 0x00, 0x53, 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02,
++ 0x00, 0x74, 0x03, 0x27, 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C,
++ 0x00, 0x02, 0x00, 0x55, 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55,
++ 0x03, 0x04, 0x00, 0x02, 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02,
++ 0x00, 0x75, 0x03, 0x06, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A,
++ 0x00, 0x02, 0x00, 0x55, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55,
++ 0x03, 0x28, 0x00, 0x02, 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02,
++ 0x00, 0x77, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02,
++ 0x00, 0x02, 0x00, 0x59, 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x5A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B,
++ 0x00, 0x02, 0x00, 0x6F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75,
++ 0x03, 0x1B, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02,
++ 0x00, 0x49, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C,
++ 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02,
++ 0x00, 0x55, 0x03, 0x44, 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C,
++ 0x00, 0x02, 0x00, 0xFC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC,
++ 0x03, 0x00, 0x00, 0x02, 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02,
++ 0x02, 0x26, 0x03, 0x04, 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04,
++ 0x00, 0x02, 0x00, 0xE6, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02,
++ 0x00, 0x4F, 0x03, 0x28, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28,
++ 0x00, 0x02, 0x01, 0x4D, 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0x67, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00,
++ 0x00, 0x02, 0x00, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0xF8, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F,
++ 0x00, 0x02, 0x00, 0x41, 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45,
++ 0x03, 0x0F, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02,
++ 0x00, 0x65, 0x03, 0x11, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F,
++ 0x00, 0x02, 0x00, 0x49, 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F,
++ 0x03, 0x0F, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02,
++ 0x00, 0x6F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F,
++ 0x00, 0x02, 0x00, 0x52, 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55,
++ 0x03, 0x0F, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02,
++ 0x00, 0x75, 0x03, 0x11, 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26,
++ 0x00, 0x02, 0x00, 0x54, 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48,
++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x61, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27,
++ 0x00, 0x02, 0x00, 0xD6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5,
++ 0x03, 0x04, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x6F, 0x03, 0x07, 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04,
++ 0x00, 0x02, 0x00, 0x59, 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41,
++ 0x03, 0x25, 0x00, 0x02, 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x62, 0x03, 0x07, 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23,
++ 0x00, 0x02, 0x00, 0x42, 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x64, 0x03, 0x07, 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23,
++ 0x00, 0x02, 0x00, 0x44, 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44,
++ 0x03, 0x27, 0x00, 0x02, 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02,
++ 0x00, 0x64, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00,
++ 0x00, 0x02, 0x01, 0x12, 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45,
++ 0x03, 0x2D, 0x00, 0x02, 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02,
++ 0x00, 0x65, 0x03, 0x30, 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27,
++ 0x00, 0x02, 0x00, 0x46, 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47,
++ 0x03, 0x04, 0x00, 0x02, 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x68, 0x03, 0x07, 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23,
++ 0x00, 0x02, 0x00, 0x48, 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48,
++ 0x03, 0x27, 0x00, 0x02, 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02,
++ 0x00, 0x68, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30,
++ 0x00, 0x02, 0x00, 0x49, 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x6B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31,
++ 0x00, 0x02, 0x00, 0x4C, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36,
++ 0x03, 0x04, 0x00, 0x02, 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02,
++ 0x00, 0x6C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D,
++ 0x00, 0x02, 0x00, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D,
++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x6D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07,
++ 0x00, 0x02, 0x00, 0x4E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E,
++ 0x03, 0x31, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02,
++ 0x00, 0x6E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01,
++ 0x00, 0x02, 0x00, 0xD5, 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C,
++ 0x03, 0x00, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02,
++ 0x01, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01,
++ 0x00, 0x02, 0x00, 0x50, 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52,
++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x72, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04,
++ 0x00, 0x02, 0x00, 0x52, 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53,
++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x73, 0x03, 0x23, 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07,
++ 0x00, 0x02, 0x01, 0x60, 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60,
++ 0x03, 0x23, 0x00, 0x02, 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x74, 0x03, 0x07, 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23,
++ 0x00, 0x02, 0x00, 0x54, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54,
++ 0x03, 0x2D, 0x00, 0x02, 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02,
++ 0x00, 0x75, 0x03, 0x24, 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30,
++ 0x00, 0x02, 0x00, 0x55, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68,
++ 0x03, 0x01, 0x00, 0x02, 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02,
++ 0x01, 0x6B, 0x03, 0x08, 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03,
++ 0x00, 0x02, 0x00, 0x56, 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57,
++ 0x03, 0x00, 0x00, 0x02, 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0x77, 0x03, 0x01, 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08,
++ 0x00, 0x02, 0x00, 0x57, 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57,
++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x78, 0x03, 0x07, 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08,
++ 0x00, 0x02, 0x00, 0x59, 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A,
++ 0x03, 0x02, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x7A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31,
++ 0x00, 0x02, 0x00, 0x68, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77,
++ 0x03, 0x0A, 0x00, 0x02, 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02,
++ 0x00, 0x41, 0x03, 0x23, 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09,
++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02,
++ 0x00, 0xC2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03,
++ 0x00, 0x02, 0x00, 0xE2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2,
++ 0x03, 0x23, 0x00, 0x02, 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02,
++ 0x01, 0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09,
++ 0x00, 0x02, 0x01, 0x03, 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03,
++ 0x03, 0x03, 0x00, 0x02, 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x45, 0x03, 0x23, 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09,
++ 0x00, 0x02, 0x00, 0x65, 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65,
++ 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02,
++ 0x00, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09,
++ 0x00, 0x02, 0x00, 0xEA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA,
++ 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02,
++ 0x00, 0x49, 0x03, 0x09, 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23,
++ 0x00, 0x02, 0x00, 0x69, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F,
++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02,
++ 0x00, 0xD4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00,
++ 0x00, 0x02, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4,
++ 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02,
++ 0x00, 0xD4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B,
++ 0x00, 0x02, 0x00, 0xF3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2,
++ 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02,
++ 0x00, 0xD5, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23,
++ 0x00, 0x02, 0x01, 0xA1, 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75,
++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02,
++ 0x00, 0xDA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B,
++ 0x00, 0x02, 0x00, 0xF9, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0,
++ 0x03, 0x09, 0x00, 0x02, 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02,
++ 0x01, 0xAF, 0x03, 0x23, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00,
++ 0x00, 0x02, 0x00, 0x79, 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79,
++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02,
++ 0x00, 0x59, 0x03, 0x03, 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x01, 0x01, 0xF1, 0x00, 0xC0,
++ 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8, 0x00, 0xC9,
++ 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1, 0x00, 0xD2,
++ 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, 0x00, 0xDC,
++ 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE7,
++ 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE, 0x00, 0xEF,
++ 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, 0x00, 0xFA,
++ 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03,
++ 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B,
++ 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15,
++ 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D,
++ 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25,
++ 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E, 0x01, 0x2F,
++ 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x3B,
++ 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47,
++ 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51, 0x01, 0x54,
++ 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x5C,
++ 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64,
++ 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D, 0x01, 0x6E,
++ 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76,
++ 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D, 0x01, 0x7E,
++ 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF, 0x01, 0xD0,
++ 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8,
++ 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1,
++ 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA, 0x01, 0xEB,
++ 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8,
++ 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x00,
++ 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08,
++ 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F, 0x02, 0x10,
++ 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18,
++ 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28,
++ 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x30,
++ 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03, 0x1E, 0x04,
++ 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B, 0x1E, 0x0C,
++ 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13, 0x1E, 0x14,
++ 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B, 0x1E, 0x1C,
++ 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23, 0x1E, 0x24,
++ 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B, 0x1E, 0x2C,
++ 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33, 0x1E, 0x34,
++ 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B, 0x1E, 0x3C,
++ 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43, 0x1E, 0x44,
++ 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B, 0x1E, 0x4C,
++ 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54,
++ 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x5C,
++ 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0x64,
++ 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B, 0x1E, 0x6C,
++ 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73, 0x1E, 0x74,
++ 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x7C,
++ 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0x84,
++ 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B, 0x1E, 0x8C,
++ 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93, 0x1E, 0x94,
++ 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0, 0x1E, 0xA1,
++ 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9,
++ 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1,
++ 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8, 0x1E, 0xB9,
++ 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1,
++ 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8, 0x1E, 0xC9,
++ 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0, 0x1E, 0xD1,
++ 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9,
++ 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1,
++ 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8, 0x1E, 0xE9,
++ 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1,
++ 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8, 0x1E, 0xF9,
++ 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76,
++ 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x01, 0xA6,
++ 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD0, 0x01, 0xD6,
++ 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, 0x02, 0x00, 0x02, 0x06,
++ 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, 0x02, 0x30, 0x02, 0x38,
++ 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62, 0x02, 0x68, 0x02, 0x70,
++ 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6,
++ 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6,
++ 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0C, 0x03, 0x12,
++ 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C, 0x03, 0x42,
++ 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A, 0x03, 0x70, 0x03, 0x76,
++ 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA,
++ 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6,
++ 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A,
++ 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x46, 0x04, 0x4E,
++ 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82,
++ 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA,
++ 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2,
++ 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A, 0x05, 0x22, 0x05, 0x2A,
++ 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A,
++ 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A,
++ 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x00, 0x02,
++ 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02, 0x00, 0x45, 0x03, 0x40,
++ 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40, 0x00, 0x02, 0x00, 0x49,
++ 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x41, 0x00, 0x02,
++ 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02, 0x00, 0x59, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41, 0x00, 0x02, 0x00, 0x65,
++ 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69, 0x03, 0x40, 0x00, 0x02,
++ 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41, 0x00, 0x02, 0x00, 0x79,
++ 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63, 0x03, 0x41, 0x00, 0x02,
++ 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x52,
++ 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53, 0x03, 0x41, 0x00, 0x02,
++ 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x04,
++ 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55,
++ 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC,
++ 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x08, 0x03, 0x04,
++ 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41, 0x03, 0x07, 0x03, 0x04,
++ 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x0C, 0x00, 0x02,
++ 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6E,
++ 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x41, 0x00, 0x02,
++ 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03,
++ 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03,
++ 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x03,
++ 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE7,
++ 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13, 0x03, 0x40, 0x00, 0x02,
++ 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02, 0x02, 0x28, 0x03, 0x06,
++ 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEF,
++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x41, 0x00, 0x02,
++ 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x04,
++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF5,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03,
++ 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x40, 0x00, 0x02,
++ 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x50, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03,
++ 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03,
++ 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x03,
++ 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x63,
++ 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69, 0x03, 0x41, 0x00, 0x03,
++ 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04, 0x03, 0x08, 0x00, 0x02,
++ 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02, 0x00, 0x57, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE2,
++ 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x40, 0x00, 0x03,
++ 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03,
++ 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02,
++ 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02, 0x01, 0x02, 0x03, 0x41,
++ 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40, 0x00, 0x02, 0x01, 0x03,
++ 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06,
++ 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06,
++ 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x06, 0x00, 0x02,
++ 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x40,
++ 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03,
++ 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03,
++ 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xB9,
++ 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x41, 0x00, 0x02,
++ 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02,
++ 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02,
++ 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x02,
++ 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA1,
++ 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x00, 0x00, 0x02,
++ 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x03,
++ 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCD,
++ 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x01, 0x00, 0x02,
++ 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02, 0x1E, 0xE6, 0x03, 0x1B,
++ 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03, 0x00, 0x02, 0x01, 0xB0,
++ 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5, 0x03, 0x1B, 0x00, 0x02,
++ 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01, 0x00, 0xAC, 0x00, 0xC0,
++ 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD9,
++ 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEC, 0x00, 0xED,
++ 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06, 0x01, 0x07, 0x01, 0x36,
++ 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55, 0x01, 0x5A, 0x01, 0x5B,
++ 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA,
++ 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, 0x01, 0xE8, 0x01, 0xEC,
++ 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC,
++ 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x30,
++ 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C,
++ 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x34, 0x1E, 0x38,
++ 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50,
++ 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64,
++ 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A,
++ 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6,
++ 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE,
++ 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6,
++ 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4,
++ 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4,
++ 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC,
++ 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8,
+ 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0,
+- 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8,
+- 0x1E, 0xF9, 0x21, 0x2B, 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A,
+- 0x01, 0x70, 0x01, 0x76, 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A,
+- 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA,
+- 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA,
+- 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A,
+- 0x02, 0x30, 0x02, 0x38, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62,
+- 0x02, 0x68, 0x02, 0x70, 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A,
+- 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA,
+- 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06,
+- 0x03, 0x0C, 0x03, 0x12, 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36,
+- 0x03, 0x3C, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A,
+- 0x03, 0x70, 0x03, 0x76, 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E,
+- 0x03, 0xA4, 0x03, 0xAA, 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6,
+- 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E,
+- 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E,
+- 0x04, 0x46, 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76,
+- 0x04, 0x7C, 0x04, 0x82, 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE,
+- 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6,
+- 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A,
+- 0x05, 0x22, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E,
+- 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E,
+- 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE,
+- 0x05, 0xB4, 0x00, 0x02, 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0x45, 0x03, 0x40, 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40,
+- 0x00, 0x02, 0x00, 0x49, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F,
+- 0x03, 0x41, 0x00, 0x02, 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0x59, 0x03, 0x41, 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41,
+- 0x00, 0x02, 0x00, 0x65, 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69,
+- 0x03, 0x40, 0x00, 0x02, 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02,
+- 0x00, 0x6F, 0x03, 0x41, 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41,
+- 0x00, 0x02, 0x00, 0x79, 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63,
+- 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0x6C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41,
+- 0x00, 0x02, 0x00, 0x52, 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53,
+- 0x03, 0x41, 0x00, 0x02, 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0x7A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x08, 0x03, 0x04, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01,
+- 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C,
+- 0x00, 0x02, 0x00, 0xDC, 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41,
+- 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41,
+- 0x03, 0x07, 0x03, 0x04, 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A,
+- 0x03, 0x0C, 0x00, 0x02, 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02,
+- 0x00, 0x47, 0x03, 0x41, 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40,
+- 0x00, 0x02, 0x00, 0x6E, 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5,
+- 0x03, 0x41, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0xD8, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08,
+- 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03,
+- 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07,
+- 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41,
+- 0x00, 0x02, 0x00, 0xE7, 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13,
+- 0x03, 0x40, 0x00, 0x02, 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02,
+- 0x02, 0x28, 0x03, 0x06, 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01,
+- 0x00, 0x02, 0x00, 0xEF, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B,
+- 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03,
+- 0x00, 0x4C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02,
+- 0x00, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41,
+- 0x00, 0x02, 0x00, 0xF5, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D,
+- 0x03, 0x40, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0x50, 0x03, 0x41, 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04,
+- 0x03, 0x23, 0x00, 0x03, 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01,
+- 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C,
+- 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07,
+- 0x00, 0x02, 0x1E, 0x63, 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69,
+- 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04,
+- 0x03, 0x08, 0x00, 0x02, 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02,
+- 0x00, 0x57, 0x03, 0x41, 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41,
+- 0x00, 0x02, 0x00, 0xE2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2,
+- 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02,
+- 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02,
+- 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02,
+- 0x01, 0x02, 0x03, 0x41, 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40,
+- 0x00, 0x02, 0x01, 0x03, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x06, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1,
+- 0x03, 0x06, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02,
+- 0x00, 0xCA, 0x03, 0x40, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02,
+- 0x03, 0x09, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02,
+- 0x03, 0x03, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02,
+- 0x00, 0x02, 0x1E, 0xB9, 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4,
+- 0x03, 0x41, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03,
+- 0x00, 0x4F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03,
+- 0x00, 0x4F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02,
+- 0x1E, 0xCC, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01,
+- 0x00, 0x02, 0x01, 0xA1, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1,
+- 0x03, 0x00, 0x00, 0x02, 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02,
+- 0x01, 0xA0, 0x03, 0x03, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B,
+- 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0,
+- 0x03, 0x01, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02,
+- 0x1E, 0xE6, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03,
+- 0x00, 0x02, 0x01, 0xB0, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5,
+- 0x03, 0x1B, 0x00, 0x02, 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01,
+- 0x00, 0xAC, 0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2,
+- 0x00, 0xD3, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9,
+- 0x00, 0xEC, 0x00, 0xED, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06,
+- 0x01, 0x07, 0x01, 0x36, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55,
+- 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8,
+- 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1,
+- 0x01, 0xE8, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA,
+- 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C,
+- 0x02, 0x2D, 0x02, 0x30, 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16,
+- 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32,
+- 0x1E, 0x34, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E,
+- 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C,
+- 0x1E, 0x5D, 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78,
+- 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4,
+- 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC,
+- 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4,
+- 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2,
+- 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2,
+- 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA,
++ 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F, 0x00, 0xA4, 0x00, 0xAA,
++ 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4,
++ 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20,
++ 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C,
++ 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C,
++ 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC,
++ 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C,
++ 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C,
++ 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94,
++ 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC,
++ 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x41,
++ 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03,
++ 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x03,
++ 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61,
++ 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02, 0x01, 0x07, 0x03, 0x27,
++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x00,
++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x01,
++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65, 0x03, 0x06, 0x03, 0x27,
++ 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x23,
++ 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04,
++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x72, 0x03, 0x23,
++ 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x41,
++ 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x73, 0x03, 0x07,
++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02,
++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02,
++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06,
++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06,
++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02,
++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02,
++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02,
++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02,
++ 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x41, 0x00, 0x02,
++ 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x09,
++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03,
++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B,
++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x41,
++ 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40, 0x00, 0x02, 0x01, 0xB0,
++ 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x09,
++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03,
++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B,
++ 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC,
++ 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16,
++ 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x38, 0x1E, 0x39,
++ 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x5C, 0x1E, 0x5D,
++ 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5,
++ 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1,
++ 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7,
++ 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB,
++ 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3,
++ 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF,
++ 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8,
++ 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6,
++ 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26,
++ 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64,
++ 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4,
++ 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4,
++ 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24,
++ 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64,
++ 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4,
++ 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x00, 0x03, 0x00, 0x55,
++ 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55,
++ 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F,
++ 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2B,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x01,
++ 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04,
++ 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x27,
++ 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x23, 0x03, 0x07,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x02,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x06,
++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65, 0x03, 0x23, 0x03, 0x02,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x02,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x01, 0x03, 0x1B,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x00, 0x03, 0x1B,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x09,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x03,
++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x1B,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x01, 0x03, 0x1B,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x00, 0x03, 0x1B,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x09,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x03,
++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x23, 0x03, 0x1B,
++ 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED,
++ 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17,
++ 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50,
++ 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4,
++ 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0,
++ 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6,
++ 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA,
+ 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2,
+ 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE,
+- 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F,
+- 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6,
+- 0x00, 0xDE, 0x00, 0xE4, 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12,
+- 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C,
+- 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C,
+- 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC,
+- 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C,
+- 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C,
+- 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84,
+- 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0,
+- 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02,
+- 0x00, 0xDC, 0x03, 0x41, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08,
+- 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04,
+- 0x03, 0x28, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01,
+- 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02,
+- 0x01, 0x07, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65,
+- 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65,
+- 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65,
+- 0x03, 0x06, 0x03, 0x27, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41,
+- 0x00, 0x02, 0x21, 0x2A, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03,
+- 0x00, 0x6C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03,
+- 0x00, 0x72, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03,
+- 0x00, 0x73, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03,
+- 0x00, 0x73, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x75, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03,
+- 0x00, 0x61, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x65, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x65, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03,
+- 0x00, 0x65, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1,
+- 0x03, 0x41, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03,
+- 0x00, 0x4F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03,
+- 0x00, 0x4F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03,
+- 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02,
+- 0x01, 0xAF, 0x03, 0x41, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40,
+- 0x00, 0x02, 0x01, 0xB0, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03,
+- 0x00, 0x75, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03,
+- 0x00, 0x75, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03,
+- 0x00, 0x75, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB,
+- 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14,
+- 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30,
+- 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53,
+- 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79,
+- 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF,
+- 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1,
+- 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9,
+- 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1,
+- 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED,
+- 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98,
+- 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6,
+- 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16,
+- 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54,
+- 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94,
+- 0x01, 0x9C, 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4,
+- 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14,
+- 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54,
+- 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94,
+- 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4,
+- 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01,
+- 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40,
+- 0x00, 0x03, 0x00, 0x4F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04,
+- 0x00, 0x02, 0x21, 0x2B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03,
+- 0x00, 0x43, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03,
+- 0x00, 0x45, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03,
+- 0x00, 0x45, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03,
+- 0x00, 0x45, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03,
+- 0x00, 0x49, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02,
+- 0x21, 0x2A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73,
+- 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61,
+- 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61,
+- 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61,
+- 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61,
+- 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61,
+- 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61,
+- 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65,
+- 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65,
+- 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65,
+- 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F,
+- 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75,
+- 0x03, 0x23, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC,
+- 0x01, 0xEC, 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15,
+- 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C,
+- 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78,
+- 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE,
+- 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0,
+- 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8,
+- 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0,
+- 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC,
+- 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F,
+- 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C,
+- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03,
+- 0x00, 0x55, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03,
+- 0x00, 0x41, 0x03, 0x0A, 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x63, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03,
+- 0x00, 0x69, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03,
+- 0x00, 0x75, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03,
+- 0x00, 0x75, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA,
+- 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD,
+- 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C,
+- 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C,
+- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43,
+- 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F,
+- 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F,
+- 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55,
+- 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55,
+- 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B,
+- 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8,
+- 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22,
+- 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62,
+- 0x00, 0x03, 0x00, 0x43, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27,
+- 0x00, 0x03, 0x00, 0x4F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B,
+- 0x00, 0x03, 0x00, 0x4F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B,
+- 0x00, 0x03, 0x00, 0x55, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B,
+- 0x00, 0x03, 0x00, 0x55, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B,
+- 0x00, 0x01, 0x00, 0x0A, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD,
+- 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
+- 0x00, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C,
+- 0x0D, 0x4A, 0x00, 0x02, 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04,
+- 0x0D, 0x4B, 0x00, 0x02, 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02,
+- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12,
+- 0x00, 0x18, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02,
+- 0x0D, 0x46, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04,
++ 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2C,
++ 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C,
++ 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08,
++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B,
++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B,
++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B,
++ 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09,
++ 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9,
++ 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C,
++ 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C,
++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x41,
++ 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x40,
++ 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B, 0x01, 0xFA, 0x1E, 0x08,
++ 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA,
++ 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32,
++ 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x03, 0x00, 0x43,
++ 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x4F,
++ 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F,
++ 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55,
++ 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55,
++ 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x0A,
++ 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9,
++ 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26,
++ 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0D, 0x4A, 0x00, 0x02,
++ 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04, 0x0D, 0x4B, 0x00, 0x02,
++ 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01,
++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02,
++ 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x57,
++ 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x10, 0x26,
++ 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01,
++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x10, 0x25, 0x10, 0x2E,
++ 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x22, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B,
++ 0x00, 0x02, 0x0B, 0x3E, 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57,
++ 0x00, 0x01, 0x00, 0x01, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x56,
++ 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03,
++ 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x18,
++ 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03, 0x0D, 0xCF, 0x0D, 0xCA,
++ 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04,
++ 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDC, 0x00, 0x02,
++ 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E,
++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9,
++ 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDF, 0x00, 0x01,
++ 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01,
++ 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x01, 0x0D, 0xDD,
++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, 0x00, 0x03, 0x00, 0x0C,
++ 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x02,
++ 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC, 0x00, 0x02, 0x0B, 0xD7,
++ 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01, 0x00, 0x03, 0x0B, 0x92,
++ 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26,
++ 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0B, 0x92, 0x0B, 0xD7,
++ 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC6,
++ 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB, 0x0B, 0xCC, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
+- 0x00, 0x04, 0x10, 0x26, 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02,
++ 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x46, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02,
+- 0x10, 0x25, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x3A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01,
+- 0x00, 0x04, 0x0B, 0x5C, 0x00, 0x02, 0x0B, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x5D, 0x00, 0x02,
+- 0x0B, 0x3C, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B, 0x00, 0x02, 0x0B, 0x3E,
+- 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03,
+- 0x0B, 0x21, 0x0B, 0x22, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
+- 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02,
+- 0x0B, 0x47, 0x0B, 0x56, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57,
+- 0x00, 0x02, 0x0B, 0x21, 0x0B, 0x3C, 0x00, 0x02, 0x0B, 0x22, 0x0B, 0x3C, 0x00, 0x01, 0x00, 0x05,
+- 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x0B, 0x5C, 0x0B, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A,
+- 0x00, 0x10, 0x00, 0x18, 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03,
+- 0x0D, 0xCF, 0x0D, 0xCA, 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF,
+- 0x00, 0x01, 0x00, 0x04, 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9,
+- 0x0D, 0xDC, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26,
+- 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA,
+- 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9,
+- 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01,
+- 0x00, 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01,
+- 0x00, 0x01, 0x0D, 0xDD, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32,
+- 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02,
+- 0x0B, 0xD7, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC,
+- 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01,
+- 0x00, 0x03, 0x0B, 0x92, 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
+- 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02,
+- 0x0B, 0x92, 0x0B, 0xD7, 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE,
+- 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB,
+- 0x0B, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01,
+- 0x0C, 0x46, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01,
+- 0x00, 0x08, 0x00, 0x02, 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04,
+- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xEE, 0x00, 0x12, 0x00, 0x2A, 0x00, 0x34,
+- 0x00, 0x3E, 0x00, 0x48, 0x00, 0x52, 0x00, 0x5C, 0x00, 0x66, 0x00, 0x80, 0x00, 0x8A, 0x00, 0x94,
+- 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xDA, 0x00, 0xE4,
+- 0x00, 0x01, 0x00, 0x04, 0x0F, 0x69, 0x00, 0x02, 0x0F, 0xB5, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x43,
+- 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x4D, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01,
+- 0x00, 0x04, 0x0F, 0x52, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x57, 0x00, 0x02,
+- 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x5C, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x03, 0x00, 0x08,
+- 0x00, 0x0E, 0x00, 0x14, 0x0F, 0x73, 0x00, 0x02, 0x0F, 0x72, 0x0F, 0x75, 0x00, 0x02, 0x0F, 0x74,
+- 0x0F, 0x81, 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x73, 0x00, 0x02, 0x0F, 0x71,
+- 0x00, 0x01, 0x00, 0x04, 0x0F, 0x75, 0x00, 0x02, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x81,
+- 0x00, 0x02, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xB9, 0x00, 0x02, 0x0F, 0xB5, 0x00, 0x01,
+- 0x00, 0x04, 0x0F, 0x93, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x9D, 0x00, 0x02,
+- 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xA2, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04,
+- 0x0F, 0xA7, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xAC, 0x00, 0x02, 0x0F, 0xB7,
+- 0x00, 0x01, 0x00, 0x04, 0x0F, 0x76, 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x78,
+- 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x12, 0x0F, 0x40, 0x0F, 0x42, 0x0F, 0x4C, 0x0F, 0x51,
+- 0x0F, 0x56, 0x0F, 0x5B, 0x0F, 0x71, 0x0F, 0x72, 0x0F, 0x74, 0x0F, 0x80, 0x0F, 0x90, 0x0F, 0x92,
+- 0x0F, 0x9C, 0x0F, 0xA1, 0x0F, 0xA6, 0x0F, 0xAB, 0x0F, 0xB2, 0x0F, 0xB3, 0x00, 0x02, 0x00, 0x00,
+- 0x00, 0x02, 0x00, 0x0A, 0x00, 0xBE, 0x00, 0x01, 0x00, 0x8E, 0x00, 0x11, 0x00, 0x28, 0x00, 0x2E,
+- 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E,
+- 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x02,
+- 0x0F, 0x42, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x4C, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x51, 0x0F, 0xB7,
+- 0x00, 0x02, 0x0F, 0x56, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x5B, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x40,
+- 0x0F, 0xB5, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x72, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x74, 0x00, 0x02,
+- 0x0F, 0xB2, 0x0F, 0x80, 0x00, 0x02, 0x0F, 0xB3, 0x0F, 0x80, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x80,
+- 0x00, 0x02, 0x0F, 0x92, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x9C, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xA1,
+- 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xA6, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xAB, 0x0F, 0xB7, 0x00, 0x02,
+- 0x0F, 0x90, 0x0F, 0xB5, 0x00, 0x01, 0x00, 0x11, 0x0F, 0x43, 0x0F, 0x4D, 0x0F, 0x52, 0x0F, 0x57,
+- 0x0F, 0x5C, 0x0F, 0x69, 0x0F, 0x73, 0x0F, 0x75, 0x0F, 0x76, 0x0F, 0x78, 0x0F, 0x81, 0x0F, 0x93,
+- 0x0F, 0x9D, 0x0F, 0xA2, 0x0F, 0xA7, 0x0F, 0xAC, 0x0F, 0xB9, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03,
+- 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0F, 0x72, 0x0F, 0x71, 0x00, 0x02, 0x0F, 0x74,
+- 0x0F, 0x71, 0x00, 0x02, 0x0F, 0x80, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x03, 0x0F, 0x73, 0x0F, 0x75,
+- 0x0F, 0x81
++ 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01,
++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A,
++ 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01,
++ 0x00, 0x04, 0x1B, 0x06, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x08, 0x00, 0x02,
++ 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0A, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04,
++ 0x1B, 0x0C, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0E, 0x00, 0x02, 0x1B, 0x35,
++ 0x00, 0x01, 0x00, 0x04, 0x1B, 0x12, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3B,
++ 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3D, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01,
++ 0x00, 0x04, 0x1B, 0x40, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x41, 0x00, 0x02,
++ 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x43, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B,
++ 0x1B, 0x05, 0x1B, 0x07, 0x1B, 0x09, 0x1B, 0x0B, 0x1B, 0x0D, 0x1B, 0x11, 0x1B, 0x3A, 0x1B, 0x3C,
++ 0x1B, 0x3E, 0x1B, 0x3F, 0x1B, 0x42, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
++ 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A,
++ 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x1B, 0x05, 0x1B, 0x35,
++ 0x00, 0x02, 0x1B, 0x07, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x09, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0B,
++ 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0D, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x11, 0x1B, 0x35, 0x00, 0x02,
++ 0x1B, 0x3A, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3C, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3E, 0x1B, 0x35,
++ 0x00, 0x02, 0x1B, 0x3F, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x42, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B,
++ 0x1B, 0x06, 0x1B, 0x08, 0x1B, 0x0A, 0x1B, 0x0C, 0x1B, 0x0E, 0x1B, 0x12, 0x1B, 0x3B, 0x1B, 0x3D,
++ 0x1B, 0x40, 0x1B, 0x41, 0x1B, 0x43
+ };
+
+ const le_uint8 CanonShaping::glyphDefinitionTable[] = {
+@@ -3701,7 +3561,7 @@
+ 0xFC, 0x00, 0xFC, 0x5D, 0x00, 0x02, 0xFC, 0x64, 0xFC, 0xF1, 0x00, 0x02, 0xFC, 0xF5, 0xFD, 0x3D,
+ 0x00, 0x02, 0xFD, 0x50, 0xFD, 0x8F, 0x00, 0x02, 0xFD, 0x92, 0xFD, 0xC7, 0x00, 0x02, 0xFD, 0xF0,
+ 0xFD, 0xFC, 0x00, 0x02, 0xFE, 0x80, 0xFE, 0xF4, 0x00, 0x01, 0xFE, 0xF5, 0xFE, 0xFC, 0x00, 0x02,
+- 0x00, 0x02, 0x00, 0xC1, 0x03, 0x00, 0x03, 0x14, 0x00, 0xE6, 0x03, 0x15, 0x03, 0x15, 0x00, 0xE8,
++ 0x00, 0x02, 0x00, 0xCE, 0x03, 0x00, 0x03, 0x14, 0x00, 0xE6, 0x03, 0x15, 0x03, 0x15, 0x00, 0xE8,
+ 0x03, 0x16, 0x03, 0x19, 0x00, 0xDC, 0x03, 0x1A, 0x03, 0x1A, 0x00, 0xE8, 0x03, 0x1B, 0x03, 0x1B,
+ 0x00, 0xD8, 0x03, 0x1C, 0x03, 0x20, 0x00, 0xDC, 0x03, 0x21, 0x03, 0x22, 0x00, 0xCA, 0x03, 0x23,
+ 0x03, 0x26, 0x00, 0xDC, 0x03, 0x27, 0x03, 0x28, 0x00, 0xCA, 0x03, 0x29, 0x03, 0x33, 0x00, 0xDC,
+@@ -3719,61 +3579,66 @@
+ 0x05, 0xA7, 0x00, 0xDC, 0x05, 0xA8, 0x05, 0xA8, 0x00, 0xE6, 0x05, 0xA9, 0x05, 0xA9, 0x00, 0xE8,
+ 0x05, 0xAA, 0x05, 0xAA, 0x00, 0xDC, 0x05, 0xAB, 0x05, 0xAC, 0x00, 0xE6, 0x05, 0xAD, 0x05, 0xAD,
+ 0x00, 0xDE, 0x05, 0xAE, 0x05, 0xAE, 0x00, 0xE8, 0x05, 0xAF, 0x05, 0xAF, 0x00, 0xE6, 0x05, 0xB0,
+- 0x05, 0xB8, 0x00, 0xDC, 0x05, 0xB9, 0x05, 0xB9, 0x00, 0x1B, 0x05, 0xBB, 0x05, 0xBB, 0x00, 0xDC,
+- 0x05, 0xBC, 0x05, 0xBC, 0x00, 0x15, 0x05, 0xBD, 0x05, 0xBD, 0x00, 0xDC, 0x05, 0xBF, 0x05, 0xBF,
+- 0x00, 0x17, 0x05, 0xC1, 0x05, 0xC1, 0x00, 0x0A, 0x05, 0xC2, 0x05, 0xC2, 0x00, 0x0B, 0x05, 0xC4,
+- 0x05, 0xC4, 0x00, 0xE6, 0x05, 0xC5, 0x05, 0xC5, 0x00, 0xDC, 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x12,
+- 0x06, 0x10, 0x06, 0x15, 0x00, 0xE6, 0x06, 0x4B, 0x06, 0x4C, 0x00, 0x1F, 0x06, 0x4D, 0x06, 0x4D,
+- 0x00, 0x1E, 0x06, 0x4E, 0x06, 0x4F, 0x00, 0x1F, 0x06, 0x50, 0x06, 0x50, 0x00, 0x1E, 0x06, 0x51,
+- 0x06, 0x51, 0x00, 0x1C, 0x06, 0x52, 0x06, 0x52, 0x00, 0x1F, 0x06, 0x53, 0x06, 0x53, 0x00, 0x20,
+- 0x06, 0x54, 0x06, 0x55, 0x00, 0x1B, 0x06, 0x56, 0x06, 0x56, 0x00, 0x1D, 0x06, 0x57, 0x06, 0x58,
+- 0x00, 0x1F, 0x06, 0x59, 0x06, 0x5B, 0x00, 0xE6, 0x06, 0x5C, 0x06, 0x5C, 0x00, 0xDC, 0x06, 0x5D,
+- 0x06, 0x5E, 0x00, 0xE6, 0x06, 0x70, 0x06, 0x70, 0x00, 0x1D, 0x06, 0xD6, 0x06, 0xDC, 0x00, 0xE6,
+- 0x06, 0xDF, 0x06, 0xE0, 0x00, 0xE6, 0x06, 0xE1, 0x06, 0xE1, 0x00, 0x1F, 0x06, 0xE2, 0x06, 0xE2,
+- 0x00, 0xE6, 0x06, 0xE3, 0x06, 0xE3, 0x00, 0xDC, 0x06, 0xE4, 0x06, 0xE4, 0x00, 0xE6, 0x06, 0xE7,
+- 0x06, 0xE8, 0x00, 0xE6, 0x06, 0xEA, 0x06, 0xEA, 0x00, 0xDC, 0x06, 0xEB, 0x06, 0xEC, 0x00, 0xE6,
+- 0x06, 0xED, 0x06, 0xED, 0x00, 0xDC, 0x07, 0x11, 0x07, 0x11, 0x00, 0x24, 0x07, 0x30, 0x07, 0x30,
+- 0x00, 0xE6, 0x07, 0x31, 0x07, 0x31, 0x00, 0xDC, 0x07, 0x32, 0x07, 0x33, 0x00, 0xE6, 0x07, 0x34,
+- 0x07, 0x34, 0x00, 0xDC, 0x07, 0x35, 0x07, 0x36, 0x00, 0xE6, 0x07, 0x37, 0x07, 0x39, 0x00, 0xDC,
+- 0x07, 0x3A, 0x07, 0x3A, 0x00, 0xE6, 0x07, 0x3B, 0x07, 0x3C, 0x00, 0xDC, 0x07, 0x3D, 0x07, 0x3D,
+- 0x00, 0xE6, 0x07, 0x3E, 0x07, 0x3E, 0x00, 0xDC, 0x07, 0x3F, 0x07, 0x41, 0x00, 0xE6, 0x07, 0x42,
+- 0x07, 0x42, 0x00, 0xDC, 0x07, 0x43, 0x07, 0x43, 0x00, 0xE6, 0x07, 0x44, 0x07, 0x44, 0x00, 0xDC,
+- 0x07, 0x45, 0x07, 0x45, 0x00, 0xE6, 0x07, 0x46, 0x07, 0x46, 0x00, 0xDC, 0x07, 0x47, 0x07, 0x47,
+- 0x00, 0xE6, 0x07, 0x48, 0x07, 0x48, 0x00, 0xDC, 0x07, 0x49, 0x07, 0x4A, 0x00, 0xE6, 0x09, 0x3C,
+- 0x09, 0x3C, 0x00, 0x07, 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x09, 0x09, 0x51, 0x09, 0x51, 0x00, 0xE6,
+- 0x09, 0x52, 0x09, 0x52, 0x00, 0xDC, 0x09, 0x53, 0x09, 0x54, 0x00, 0xE6, 0x09, 0xBC, 0x09, 0xBC,
+- 0x00, 0x07, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x09, 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x07, 0x0A, 0x4D,
+- 0x0A, 0x4D, 0x00, 0x09, 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x07, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x09,
+- 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x07, 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x09, 0x0B, 0xCD, 0x0B, 0xCD,
+- 0x00, 0x09, 0x0C, 0x4D, 0x0C, 0x4D, 0x00, 0x09, 0x0C, 0x55, 0x0C, 0x55, 0x00, 0x54, 0x0C, 0x56,
+- 0x0C, 0x56, 0x00, 0x5B, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x07, 0x0C, 0xCD, 0x0C, 0xCD, 0x00, 0x09,
+- 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x09, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x09, 0x0E, 0x38, 0x0E, 0x39,
+- 0x00, 0x67, 0x0E, 0x3A, 0x0E, 0x3A, 0x00, 0x09, 0x0E, 0x48, 0x0E, 0x4B, 0x00, 0x6B, 0x0E, 0xB8,
+- 0x0E, 0xB9, 0x00, 0x76, 0x0E, 0xC8, 0x0E, 0xCB, 0x00, 0x7A, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0xDC,
+- 0x0F, 0x35, 0x0F, 0x35, 0x00, 0xDC, 0x0F, 0x37, 0x0F, 0x37, 0x00, 0xDC, 0x0F, 0x39, 0x0F, 0x39,
+- 0x00, 0xD8, 0x0F, 0x71, 0x0F, 0x71, 0x00, 0x81, 0x0F, 0x72, 0x0F, 0x72, 0x00, 0x82, 0x0F, 0x74,
+- 0x0F, 0x74, 0x00, 0x84, 0x0F, 0x7A, 0x0F, 0x7D, 0x00, 0x82, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x82,
+- 0x0F, 0x82, 0x0F, 0x83, 0x00, 0xE6, 0x0F, 0x84, 0x0F, 0x84, 0x00, 0x09, 0x0F, 0x86, 0x0F, 0x87,
+- 0x00, 0xE6, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0xDC, 0x10, 0x37, 0x10, 0x37, 0x00, 0x07, 0x10, 0x39,
+- 0x10, 0x39, 0x00, 0x09, 0x13, 0x5F, 0x13, 0x5F, 0x00, 0xE6, 0x17, 0x14, 0x17, 0x14, 0x00, 0x09,
+- 0x17, 0x34, 0x17, 0x34, 0x00, 0x09, 0x17, 0xD2, 0x17, 0xD2, 0x00, 0x09, 0x17, 0xDD, 0x17, 0xDD,
+- 0x00, 0xE6, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0xE4, 0x19, 0x39, 0x19, 0x39, 0x00, 0xDE, 0x19, 0x3A,
+- 0x19, 0x3A, 0x00, 0xE6, 0x19, 0x3B, 0x19, 0x3B, 0x00, 0xDC, 0x1A, 0x17, 0x1A, 0x17, 0x00, 0xE6,
+- 0x1A, 0x18, 0x1A, 0x18, 0x00, 0xDC, 0x1D, 0xC0, 0x1D, 0xC1, 0x00, 0xE6, 0x1D, 0xC2, 0x1D, 0xC2,
+- 0x00, 0xDC, 0x1D, 0xC3, 0x1D, 0xC3, 0x00, 0xE6, 0x20, 0xD0, 0x20, 0xD1, 0x00, 0xE6, 0x20, 0xD2,
+- 0x20, 0xD3, 0x00, 0x01, 0x20, 0xD4, 0x20, 0xD7, 0x00, 0xE6, 0x20, 0xD8, 0x20, 0xDA, 0x00, 0x01,
+- 0x20, 0xDB, 0x20, 0xDC, 0x00, 0xE6, 0x20, 0xE1, 0x20, 0xE1, 0x00, 0xE6, 0x20, 0xE5, 0x20, 0xE6,
+- 0x00, 0x01, 0x20, 0xE7, 0x20, 0xE7, 0x00, 0xE6, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0xDC, 0x20, 0xE9,
+- 0x20, 0xE9, 0x00, 0xE6, 0x20, 0xEA, 0x20, 0xEB, 0x00, 0x01, 0x30, 0x2A, 0x30, 0x2A, 0x00, 0xDA,
+- 0x30, 0x2B, 0x30, 0x2B, 0x00, 0xE4, 0x30, 0x2C, 0x30, 0x2C, 0x00, 0xE8, 0x30, 0x2D, 0x30, 0x2D,
+- 0x00, 0xDE, 0x30, 0x2E, 0x30, 0x2F, 0x00, 0xE0, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x08, 0xA8, 0x06,
+- 0xA8, 0x06, 0x00, 0x09, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x1A, 0xFE, 0x20, 0xFE, 0x23, 0x00, 0xE6,
+- 0x0A, 0x0D, 0x0A, 0x0D, 0x00, 0xDC, 0x0A, 0x0F, 0x0A, 0x0F, 0x00, 0xE6, 0x0A, 0x38, 0x0A, 0x38,
+- 0x00, 0xE6, 0x0A, 0x39, 0x0A, 0x39, 0x00, 0x01, 0x0A, 0x3A, 0x0A, 0x3A, 0x00, 0xDC, 0x0A, 0x3F,
+- 0x0A, 0x3F, 0x00, 0x09, 0xD1, 0x65, 0xD1, 0x66, 0x00, 0xD8, 0xD1, 0x67, 0xD1, 0x69, 0x00, 0x01,
+- 0xD1, 0x6D, 0xD1, 0x6D, 0x00, 0xE2, 0xD1, 0x6E, 0xD1, 0x72, 0x00, 0xD8, 0xD1, 0x7B, 0xD1, 0x82,
+- 0x00, 0xDC, 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA,
+- 0xD1, 0xAD, 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6
++ 0x05, 0xB8, 0x00, 0xDC, 0x05, 0xB9, 0x05, 0xB9, 0x00, 0x1B, 0x05, 0xBA, 0x05, 0xBA, 0x00, 0x13,
++ 0x05, 0xBB, 0x05, 0xBB, 0x00, 0xDC, 0x05, 0xBC, 0x05, 0xBC, 0x00, 0x15, 0x05, 0xBD, 0x05, 0xBD,
++ 0x00, 0xDC, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x17, 0x05, 0xC1, 0x05, 0xC1, 0x00, 0x0A, 0x05, 0xC2,
++ 0x05, 0xC2, 0x00, 0x0B, 0x05, 0xC4, 0x05, 0xC4, 0x00, 0xE6, 0x05, 0xC5, 0x05, 0xC5, 0x00, 0xDC,
++ 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x12, 0x06, 0x10, 0x06, 0x15, 0x00, 0xE6, 0x06, 0x4B, 0x06, 0x4C,
++ 0x00, 0x1F, 0x06, 0x4D, 0x06, 0x4D, 0x00, 0x1E, 0x06, 0x4E, 0x06, 0x4F, 0x00, 0x1F, 0x06, 0x50,
++ 0x06, 0x50, 0x00, 0x1E, 0x06, 0x51, 0x06, 0x51, 0x00, 0x1C, 0x06, 0x52, 0x06, 0x52, 0x00, 0x1F,
++ 0x06, 0x53, 0x06, 0x53, 0x00, 0x20, 0x06, 0x54, 0x06, 0x55, 0x00, 0x1B, 0x06, 0x56, 0x06, 0x56,
++ 0x00, 0x1D, 0x06, 0x57, 0x06, 0x58, 0x00, 0x1F, 0x06, 0x59, 0x06, 0x5B, 0x00, 0xE6, 0x06, 0x5C,
++ 0x06, 0x5C, 0x00, 0xDC, 0x06, 0x5D, 0x06, 0x5E, 0x00, 0xE6, 0x06, 0x70, 0x06, 0x70, 0x00, 0x1D,
++ 0x06, 0xD6, 0x06, 0xDC, 0x00, 0xE6, 0x06, 0xDF, 0x06, 0xE0, 0x00, 0xE6, 0x06, 0xE1, 0x06, 0xE1,
++ 0x00, 0x1F, 0x06, 0xE2, 0x06, 0xE2, 0x00, 0xE6, 0x06, 0xE3, 0x06, 0xE3, 0x00, 0xDC, 0x06, 0xE4,
++ 0x06, 0xE4, 0x00, 0xE6, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0xE6, 0x06, 0xEA, 0x06, 0xEA, 0x00, 0xDC,
++ 0x06, 0xEB, 0x06, 0xEC, 0x00, 0xE6, 0x06, 0xED, 0x06, 0xED, 0x00, 0xDC, 0x07, 0x11, 0x07, 0x11,
++ 0x00, 0x24, 0x07, 0x30, 0x07, 0x30, 0x00, 0xE6, 0x07, 0x31, 0x07, 0x31, 0x00, 0xDC, 0x07, 0x32,
++ 0x07, 0x33, 0x00, 0xE6, 0x07, 0x34, 0x07, 0x34, 0x00, 0xDC, 0x07, 0x35, 0x07, 0x36, 0x00, 0xE6,
++ 0x07, 0x37, 0x07, 0x39, 0x00, 0xDC, 0x07, 0x3A, 0x07, 0x3A, 0x00, 0xE6, 0x07, 0x3B, 0x07, 0x3C,
++ 0x00, 0xDC, 0x07, 0x3D, 0x07, 0x3D, 0x00, 0xE6, 0x07, 0x3E, 0x07, 0x3E, 0x00, 0xDC, 0x07, 0x3F,
++ 0x07, 0x41, 0x00, 0xE6, 0x07, 0x42, 0x07, 0x42, 0x00, 0xDC, 0x07, 0x43, 0x07, 0x43, 0x00, 0xE6,
++ 0x07, 0x44, 0x07, 0x44, 0x00, 0xDC, 0x07, 0x45, 0x07, 0x45, 0x00, 0xE6, 0x07, 0x46, 0x07, 0x46,
++ 0x00, 0xDC, 0x07, 0x47, 0x07, 0x47, 0x00, 0xE6, 0x07, 0x48, 0x07, 0x48, 0x00, 0xDC, 0x07, 0x49,
++ 0x07, 0x4A, 0x00, 0xE6, 0x07, 0xEB, 0x07, 0xF1, 0x00, 0xE6, 0x07, 0xF2, 0x07, 0xF2, 0x00, 0xDC,
++ 0x07, 0xF3, 0x07, 0xF3, 0x00, 0xE6, 0x09, 0x3C, 0x09, 0x3C, 0x00, 0x07, 0x09, 0x4D, 0x09, 0x4D,
++ 0x00, 0x09, 0x09, 0x51, 0x09, 0x51, 0x00, 0xE6, 0x09, 0x52, 0x09, 0x52, 0x00, 0xDC, 0x09, 0x53,
++ 0x09, 0x54, 0x00, 0xE6, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x07, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x09,
++ 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x07, 0x0A, 0x4D, 0x0A, 0x4D, 0x00, 0x09, 0x0A, 0xBC, 0x0A, 0xBC,
++ 0x00, 0x07, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x09, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x07, 0x0B, 0x4D,
++ 0x0B, 0x4D, 0x00, 0x09, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x09, 0x0C, 0x4D, 0x0C, 0x4D, 0x00, 0x09,
++ 0x0C, 0x55, 0x0C, 0x55, 0x00, 0x54, 0x0C, 0x56, 0x0C, 0x56, 0x00, 0x5B, 0x0C, 0xBC, 0x0C, 0xBC,
++ 0x00, 0x07, 0x0C, 0xCD, 0x0C, 0xCD, 0x00, 0x09, 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x09, 0x0D, 0xCA,
++ 0x0D, 0xCA, 0x00, 0x09, 0x0E, 0x38, 0x0E, 0x39, 0x00, 0x67, 0x0E, 0x3A, 0x0E, 0x3A, 0x00, 0x09,
++ 0x0E, 0x48, 0x0E, 0x4B, 0x00, 0x6B, 0x0E, 0xB8, 0x0E, 0xB9, 0x00, 0x76, 0x0E, 0xC8, 0x0E, 0xCB,
++ 0x00, 0x7A, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0xDC, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0xDC, 0x0F, 0x37,
++ 0x0F, 0x37, 0x00, 0xDC, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0xD8, 0x0F, 0x71, 0x0F, 0x71, 0x00, 0x81,
++ 0x0F, 0x72, 0x0F, 0x72, 0x00, 0x82, 0x0F, 0x74, 0x0F, 0x74, 0x00, 0x84, 0x0F, 0x7A, 0x0F, 0x7D,
++ 0x00, 0x82, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x82, 0x0F, 0x82, 0x0F, 0x83, 0x00, 0xE6, 0x0F, 0x84,
++ 0x0F, 0x84, 0x00, 0x09, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0xE6, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0xDC,
++ 0x10, 0x37, 0x10, 0x37, 0x00, 0x07, 0x10, 0x39, 0x10, 0x39, 0x00, 0x09, 0x13, 0x5F, 0x13, 0x5F,
++ 0x00, 0xE6, 0x17, 0x14, 0x17, 0x14, 0x00, 0x09, 0x17, 0x34, 0x17, 0x34, 0x00, 0x09, 0x17, 0xD2,
++ 0x17, 0xD2, 0x00, 0x09, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0xE6, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0xE4,
++ 0x19, 0x39, 0x19, 0x39, 0x00, 0xDE, 0x19, 0x3A, 0x19, 0x3A, 0x00, 0xE6, 0x19, 0x3B, 0x19, 0x3B,
++ 0x00, 0xDC, 0x1A, 0x17, 0x1A, 0x17, 0x00, 0xE6, 0x1A, 0x18, 0x1A, 0x18, 0x00, 0xDC, 0x1B, 0x34,
++ 0x1B, 0x34, 0x00, 0x07, 0x1B, 0x44, 0x1B, 0x44, 0x00, 0x09, 0x1B, 0x6B, 0x1B, 0x6B, 0x00, 0xE6,
++ 0x1B, 0x6C, 0x1B, 0x6C, 0x00, 0xDC, 0x1B, 0x6D, 0x1B, 0x73, 0x00, 0xE6, 0x1D, 0xC0, 0x1D, 0xC1,
++ 0x00, 0xE6, 0x1D, 0xC2, 0x1D, 0xC2, 0x00, 0xDC, 0x1D, 0xC3, 0x1D, 0xC9, 0x00, 0xE6, 0x1D, 0xCA,
++ 0x1D, 0xCA, 0x00, 0xDC, 0x1D, 0xFE, 0x1D, 0xFE, 0x00, 0xE6, 0x1D, 0xFF, 0x1D, 0xFF, 0x00, 0xDC,
++ 0x20, 0xD0, 0x20, 0xD1, 0x00, 0xE6, 0x20, 0xD2, 0x20, 0xD3, 0x00, 0x01, 0x20, 0xD4, 0x20, 0xD7,
++ 0x00, 0xE6, 0x20, 0xD8, 0x20, 0xDA, 0x00, 0x01, 0x20, 0xDB, 0x20, 0xDC, 0x00, 0xE6, 0x20, 0xE1,
++ 0x20, 0xE1, 0x00, 0xE6, 0x20, 0xE5, 0x20, 0xE6, 0x00, 0x01, 0x20, 0xE7, 0x20, 0xE7, 0x00, 0xE6,
++ 0x20, 0xE8, 0x20, 0xE8, 0x00, 0xDC, 0x20, 0xE9, 0x20, 0xE9, 0x00, 0xE6, 0x20, 0xEA, 0x20, 0xEB,
++ 0x00, 0x01, 0x20, 0xEC, 0x20, 0xEF, 0x00, 0xDC, 0x30, 0x2A, 0x30, 0x2A, 0x00, 0xDA, 0x30, 0x2B,
++ 0x30, 0x2B, 0x00, 0xE4, 0x30, 0x2C, 0x30, 0x2C, 0x00, 0xE8, 0x30, 0x2D, 0x30, 0x2D, 0x00, 0xDE,
++ 0x30, 0x2E, 0x30, 0x2F, 0x00, 0xE0, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x08, 0xA8, 0x06, 0xA8, 0x06,
++ 0x00, 0x09, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x1A, 0xFE, 0x20, 0xFE, 0x23, 0x00, 0xE6, 0x0A, 0x0D,
++ 0x0A, 0x0D, 0x00, 0xDC, 0x0A, 0x0F, 0x0A, 0x0F, 0x00, 0xE6, 0x0A, 0x38, 0x0A, 0x38, 0x00, 0xE6,
++ 0x0A, 0x39, 0x0A, 0x39, 0x00, 0x01, 0x0A, 0x3A, 0x0A, 0x3A, 0x00, 0xDC, 0x0A, 0x3F, 0x0A, 0x3F,
++ 0x00, 0x09, 0xD1, 0x65, 0xD1, 0x66, 0x00, 0xD8, 0xD1, 0x67, 0xD1, 0x69, 0x00, 0x01, 0xD1, 0x6D,
++ 0xD1, 0x6D, 0x00, 0xE2, 0xD1, 0x6E, 0xD1, 0x72, 0x00, 0xD8, 0xD1, 0x7B, 0xD1, 0x82, 0x00, 0xDC,
++ 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA, 0xD1, 0xAD,
++ 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CanonShaping.h b/src/share/native/sun/font/layout/CanonShaping.h
+--- jdk/src/share/native/sun/font/layout/CanonShaping.h
++++ jdk/src/share/native/sun/font/layout/CanonShaping.h
+@@ -38,7 +38,7 @@
+
+ class LEGlyphStorage;
+
+-class CanonShaping /* not : public UObject because all members are static */
++class U_LAYOUT_API CanonShaping /* not : public UObject because all members are static */
+ {
+ public:
+ static const le_uint8 glyphSubstitutionTable[];
+diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.cpp b/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
+--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
+@@ -93,7 +93,7 @@
+ TTGlyphID firstGlyph = SWAPW(startGlyph);
+ TTGlyphID lastGlyph = firstGlyph + SWAPW(glyphCount);
+
+- if (ttGlyphID > firstGlyph && ttGlyphID < lastGlyph) {
++ if (ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) {
+ return SWAPW(classValueArray[ttGlyphID - firstGlyph]);
+ }
+
+diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp b/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+@@ -52,18 +52,23 @@
+ le_uint16 substCount,
+ GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance,
+- le_int32 position)
++ le_int32 position,
++ LEErrorCode& success)
+ {
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
+ GlyphIterator tempIterator(*glyphIterator);
+
+- for (le_int16 subst = 0; subst < substCount; subst += 1) {
++ for (le_int16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) {
+ le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex);
+ le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex);
+
+ tempIterator.setCurrStreamPosition(position);
+ tempIterator.next(sequenceIndex);
+
+- lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance);
++ lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success);
+ }
+ }
+
+@@ -165,9 +170,15 @@
+ return TRUE;
+ }
+
+-le_uint32 ContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ switch(SWAPW(subtableFormat))
+ {
+ case 0:
+@@ -176,22 +187,19 @@
+ case 1:
+ {
+ const ContextualSubstitutionFormat1Subtable *subtable = (const ContextualSubstitutionFormat1Subtable *) this;
+-
+- return subtable->process(lookupProcessor, glyphIterator, fontInstance);
++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success);
+ }
+
+ case 2:
+ {
+ const ContextualSubstitutionFormat2Subtable *subtable = (const ContextualSubstitutionFormat2Subtable *) this;
+-
+- return subtable->process(lookupProcessor, glyphIterator, fontInstance);
++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success);
+ }
+
+ case 3:
+ {
+ const ContextualSubstitutionFormat3Subtable *subtable = (const ContextualSubstitutionFormat3Subtable *) this;
+-
+- return subtable->process(lookupProcessor, glyphIterator, fontInstance);
++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success);
+ }
+
+ default:
+@@ -199,9 +207,15 @@
+ }
+ }
+
+-le_uint32 ContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+ le_int32 coverageIndex = getGlyphCoverage(glyph);
+
+@@ -227,7 +241,7 @@
+ const SubstitutionLookupRecord *substLookupRecordArray =
+ (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount];
+
+- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position);
++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+
+ return matchCount + 1;
+ }
+@@ -242,9 +256,15 @@
+ return 0;
+ }
+
+-le_uint32 ContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+ le_int32 coverageIndex = getGlyphCoverage(glyph);
+
+@@ -273,7 +293,7 @@
+ const SubstitutionLookupRecord *substLookupRecordArray =
+ (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount];
+
+- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position);
++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+
+ return matchCount + 1;
+ }
+@@ -288,9 +308,15 @@
+ return 0;
+ }
+
+-le_uint32 ContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance)const
++le_uint32 ContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success)const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_uint16 gCount = SWAPW(glyphCount);
+ le_uint16 subCount = SWAPW(substCount);
+ le_int32 position = glyphIterator->getCurrStreamPosition();
+@@ -305,7 +331,7 @@
+ const SubstitutionLookupRecord *substLookupRecordArray =
+ (const SubstitutionLookupRecord *) &coverageTableOffsetArray[gCount];
+
+- ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, subCount, glyphIterator, fontInstance, position);
++ ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, subCount, glyphIterator, fontInstance, position, success);
+
+ return gCount + 1;
+ }
+@@ -315,9 +341,15 @@
+ return 0;
+ }
+
+-le_uint32 ChainingContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ChainingContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ switch(SWAPW(subtableFormat))
+ {
+ case 0:
+@@ -326,22 +358,19 @@
+ case 1:
+ {
+ const ChainingContextualSubstitutionFormat1Subtable *subtable = (const ChainingContextualSubstitutionFormat1Subtable *) this;
+-
+- return subtable->process(lookupProcessor, glyphIterator, fontInstance);
++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success);
+ }
+
+ case 2:
+ {
+ const ChainingContextualSubstitutionFormat2Subtable *subtable = (const ChainingContextualSubstitutionFormat2Subtable *) this;
+-
+- return subtable->process(lookupProcessor, glyphIterator, fontInstance);
++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success);
+ }
+
+ case 3:
+ {
+ const ChainingContextualSubstitutionFormat3Subtable *subtable = (const ChainingContextualSubstitutionFormat3Subtable *) this;
+-
+- return subtable->process(lookupProcessor, glyphIterator, fontInstance);
++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success);
+ }
+
+ default:
+@@ -355,9 +384,15 @@
+ // emptyFeatureList matches an le_uint32 or an le_uint16...
+ static const FeatureMask emptyFeatureList = 0x00000000UL;
+
+-le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+ le_int32 coverageIndex = getGlyphCoverage(glyph);
+
+@@ -405,7 +440,7 @@
+ const SubstitutionLookupRecord *substLookupRecordArray =
+ (const SubstitutionLookupRecord *) &lookaheadGlyphArray[lookaheadGlyphCount + 1];
+
+- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position);
++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+
+ return inputGlyphCount + 1;
+ }
+@@ -420,9 +455,15 @@
+ return 0;
+ }
+
+-le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+ le_int32 coverageIndex = getGlyphCoverage(glyph);
+
+@@ -479,7 +520,7 @@
+ const SubstitutionLookupRecord *substLookupRecordArray =
+ (const SubstitutionLookupRecord *) &lookaheadClassArray[lookaheadGlyphCount + 1];
+
+- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position);
++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+
+ return inputGlyphCount + 1;
+ }
+@@ -494,9 +535,15 @@
+ return 0;
+ }
+
+-le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor,
++ GlyphIterator *glyphIterator,
++ const LEFontInstance *fontInstance,
++ LEErrorCode & success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount);
+ le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]);
+ const Offset *inputCoverageTableOffsetArray = &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1];
+@@ -534,7 +581,7 @@
+ const SubstitutionLookupRecord *substLookupRecordArray =
+ (const SubstitutionLookupRecord *) &lookaheadCoverageTableOffsetArray[lookaheadGlyphCount + 1];
+
+- ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position);
++ ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+
+ return inputGlyphCount;
+ }
+diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.h b/src/share/native/sun/font/layout/ContextualSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
+@@ -72,12 +72,13 @@
+ le_uint16 substCount,
+ GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance,
+- le_int32 position);
++ le_int32 position,
++ LEErrorCode& success);
+ };
+
+ struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
+ {
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
+@@ -85,7 +86,7 @@
+ le_uint16 subRuleSetCount;
+ Offset subRuleSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct SubRuleSetTable
+@@ -110,7 +111,7 @@
+ le_uint16 subClassSetCount;
+ Offset subClassSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct SubClassSetTable
+@@ -140,12 +141,12 @@
+ Offset coverageTableOffsetArray[ANY_NUMBER];
+ //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
+
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
+ {
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
+@@ -153,7 +154,7 @@
+ le_uint16 chainSubRuleSetCount;
+ Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct ChainSubRuleSetTable
+@@ -184,7 +185,7 @@
+ le_uint16 chainSubClassSetCount;
+ Offset chainSubClassSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ struct ChainSubClassSetTable
+@@ -222,7 +223,7 @@
+ //le_uint16 substCount;
+ //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
+
+- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CoverageTables.cpp b/src/share/native/sun/font/layout/CoverageTables.cpp
+--- jdk/src/share/native/sun/font/layout/CoverageTables.cpp
++++ jdk/src/share/native/sun/font/layout/CoverageTables.cpp
+@@ -73,6 +73,10 @@
+ le_uint16 probe = power;
+ le_uint16 index = 0;
+
++ if (count == 0) {
++ return -1;
++ }
++
+ if (SWAPW(glyphArray[extra]) <= ttGlyphID) {
+ index = extra;
+ }
+diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
+@@ -59,6 +59,8 @@
+
+ entryAnchorTable->getAnchor(glyphID, fontInstance, entryAnchor);
+ glyphIterator->setCursiveEntryPoint(entryAnchor);
++ } else {
++ //glyphIterator->clearCursiveEntryPoint();
+ }
+
+ if (exitOffset != 0) {
+@@ -66,6 +68,8 @@
+
+ exitAnchorTable->getAnchor(glyphID, fontInstance, exitAnchor);
+ glyphIterator->setCursiveExitPoint(exitAnchor);
++ } else {
++ //glyphIterator->clearCursiveExitPoint();
+ }
+
+ return 1;
+diff --git a/src/share/native/sun/font/layout/DeviceTables.cpp b/src/share/native/sun/font/layout/DeviceTables.cpp
+--- jdk/src/share/native/sun/font/layout/DeviceTables.cpp
++++ jdk/src/share/native/sun/font/layout/DeviceTables.cpp
+@@ -41,13 +41,15 @@
+ const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080};
+ const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8};
+
++#define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits)
++
+ le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const
+ {
+ le_uint16 start = SWAPW(startSize);
+ le_uint16 format = SWAPW(deltaFormat) - 1;
+ le_int16 result = 0;
+
+- if (ppem >= start && ppem <= SWAPW(endSize)) {
++ if (ppem >= start && ppem <= SWAPW(endSize) && format < FORMAT_COUNT) {
+ le_uint16 sizeIndex = ppem - start;
+ le_uint16 bits = fieldBits[format];
+ le_uint16 count = 16 / bits;
+diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.cpp b/src/share/native/sun/font/layout/ExtensionSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp
+@@ -40,18 +40,24 @@
+
+ U_NAMESPACE_BEGIN
+
++// read a 32-bit value that might only be 16-bit-aligned in memory
++#define READ_LONG(code) (le_uint32)((SWAPW(*(le_uint16*)&code) << 16) + SWAPW(*(((le_uint16*)&code) + 1)))
+
+ // FIXME: should look at the format too... maybe have a sub-class for it?
+ le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType,
+- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_uint16 elt = SWAPW(extensionLookupType);
+
+ if (elt != lookupType) {
+- le_uint32 extOffset = SWAPL(extensionOffset);
++ le_uint32 extOffset = READ_LONG(extensionOffset);
+ LookupSubtable *subtable = (LookupSubtable *) ((char *) this + extOffset);
+
+- return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance);
++ return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success);
+ }
+
+ return 0;
+diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.h b/src/share/native/sun/font/layout/ExtensionSubtables.h
+--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.h
++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.h
+@@ -53,7 +53,7 @@
+ le_uint32 extensionOffset;
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, le_uint16 lookupType,
+- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/Features.cpp b/src/share/native/sun/font/layout/Features.cpp
+--- jdk/src/share/native/sun/font/layout/Features.cpp
++++ jdk/src/share/native/sun/font/layout/Features.cpp
+@@ -33,7 +33,7 @@
+ #include "LETypes.h"
+ #include "OpenTypeUtilities.h"
+ #include "OpenTypeTables.h"
+-#include "Features.h"
++#include "ICUFeatures.h"
+ #include "LESwaps.h"
+
+ U_NAMESPACE_BEGIN
+diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.cpp b/src/share/native/sun/font/layout/GXLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp
+@@ -41,8 +41,8 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine)
+
+-GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable)
+- : LayoutEngine(fontInstance, scriptCode, languageCode, 0), fMorphTable(morphTable)
++GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success)
++ : LayoutEngine(fontInstance, scriptCode, languageCode, 0, success), fMorphTable(morphTable)
+ {
+ // nothing else to do?
+ }
+diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.h b/src/share/native/sun/font/layout/GXLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.h
+@@ -67,13 +67,14 @@
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
+ * @param morphTable - the 'mort' table
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LayoutEngine::layoutEngineFactory
+ * @see ScriptAndLangaugeTags.h for script and language codes
+ *
+ * @internal
+ */
+- GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable);
++ GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+diff --git a/src/share/native/sun/font/layout/GlyphIterator.cpp b/src/share/native/sun/font/layout/GlyphIterator.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphIterator.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphIterator.cpp
+@@ -44,7 +44,7 @@
+ FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
+ : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
+ glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
+- srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask),
++ srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0),
+ glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL)
+
+ {
+@@ -78,6 +78,7 @@
+ destIndex = that.destIndex;
+ lookupFlags = that.lookupFlags;
+ featureMask = that.featureMask;
++ glyphGroup = that.glyphGroup;
+ glyphClassDefinitionTable = that.glyphClassDefinitionTable;
+ markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
+ }
+@@ -95,6 +96,7 @@
+ destIndex = that.destIndex;
+ lookupFlags = that.lookupFlags;
+ featureMask = newFeatureMask;
++ glyphGroup = 0;
+ glyphClassDefinitionTable = that.glyphClassDefinitionTable;
+ markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
+ }
+@@ -112,6 +114,7 @@
+ destIndex = that.destIndex;
+ lookupFlags = newLookupFlags;
+ featureMask = that.featureMask;
++ glyphGroup = that.glyphGroup;
+ glyphClassDefinitionTable = that.glyphClassDefinitionTable;
+ markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
+ }
+@@ -125,12 +128,13 @@
+ {
+ position = prevLimit;
+ featureMask = newFeatureMask;
++ glyphGroup = 0;
+ lookupFlags = newLookupFlags;
+ }
+
+-LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count)
++LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count, LEErrorCode& success)
+ {
+- return glyphStorage.insertGlyphs(position, count);
++ return glyphStorage.insertGlyphs(position, count, success);
+ }
+
+ le_int32 GlyphIterator::applyInsertions()
+@@ -299,6 +303,36 @@
+ glyphPositionAdjustments->setYAdvance(position, yAdvanceAdjust);
+ }
+
++void GlyphIterator::clearCursiveEntryPoint()
++{
++ if (direction < 0) {
++ if (position <= nextLimit || position >= prevLimit) {
++ return;
++ }
++ } else {
++ if (position <= prevLimit || position >= nextLimit) {
++ return;
++ }
++ }
++
++ glyphPositionAdjustments->clearEntryPoint(position);
++}
++
++void GlyphIterator::clearCursiveExitPoint()
++{
++ if (direction < 0) {
++ if (position <= nextLimit || position >= prevLimit) {
++ return;
++ }
++ } else {
++ if (position <= prevLimit || position >= nextLimit) {
++ return;
++ }
++ }
++
++ glyphPositionAdjustments->clearExitPoint(position);
++}
++
+ void GlyphIterator::setCursiveEntryPoint(LEPoint &entryPoint)
+ {
+ if (direction < 0) {
+@@ -391,7 +425,7 @@
+ }
+ }
+
+-le_bool GlyphIterator::hasFeatureTag() const
++le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const
+ {
+ if (featureMask == 0) {
+ return TRUE;
+@@ -400,14 +434,18 @@
+ LEErrorCode success = LE_NO_ERROR;
+ FeatureMask fm = glyphStorage.getAuxData(position, success);
+
+- return (fm & featureMask) != 0;
++ return ((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup);
+ }
+
+ le_bool GlyphIterator::findFeatureTag()
+ {
++ //glyphGroup = 0;
++
+ while (nextInternal()) {
+- if (hasFeatureTag()) {
+- prevInternal();
++ if (hasFeatureTag(FALSE)) {
++ LEErrorCode success = LE_NO_ERROR;
++
++ glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK);
+ return TRUE;
+ }
+ }
+@@ -435,7 +473,7 @@
+
+ le_bool GlyphIterator::next(le_uint32 delta)
+ {
+- return nextInternal(delta) && hasFeatureTag();
++ return nextInternal(delta) && hasFeatureTag(TRUE);
+ }
+
+ le_bool GlyphIterator::prevInternal(le_uint32 delta)
+@@ -457,7 +495,7 @@
+
+ le_bool GlyphIterator::prev(le_uint32 delta)
+ {
+- return prevInternal(delta) && hasFeatureTag();
++ return prevInternal(delta) && hasFeatureTag(TRUE);
+ }
+
+ le_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const
+diff --git a/src/share/native/sun/font/layout/GlyphIterator.h b/src/share/native/sun/font/layout/GlyphIterator.h
+--- jdk/src/share/native/sun/font/layout/GlyphIterator.h
++++ jdk/src/share/native/sun/font/layout/GlyphIterator.h
+@@ -88,16 +88,18 @@
+ void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
+ float xAdvanceAdjust, float yAdvanceAdjust);
+
++ void clearCursiveEntryPoint();
++ void clearCursiveExitPoint();
+ void setCursiveEntryPoint(LEPoint &entryPoint);
+ void setCursiveExitPoint(LEPoint &exitPoint);
+ void setCursiveGlyph();
+
+- LEGlyphID *insertGlyphs(le_int32 count);
++ LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success);
+ le_int32 applyInsertions();
+
+ private:
+ le_bool filterGlyph(le_uint32 index) const;
+- le_bool hasFeatureTag() const;
++ le_bool hasFeatureTag(le_bool matchGroup) const;
+ le_bool nextInternal(le_uint32 delta = 1);
+ le_bool prevInternal(le_uint32 delta = 1);
+
+@@ -113,6 +115,7 @@
+ le_int32 destIndex;
+ le_uint16 lookupFlags;
+ FeatureMask featureMask;
++ le_int32 glyphGroup;
+
+ const GlyphClassDefinitionTable *glyphClassDefinitionTable;
+ const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable;
+diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp b/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp
+@@ -71,6 +71,20 @@
+ return fEntryExitPoints[index].getExitPoint(exitPoint);
+ }
+
++void GlyphPositionAdjustments::clearEntryPoint(le_int32 index)
++{
++ CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount);
++
++ fEntryExitPoints[index].clearEntryPoint();
++}
++
++void GlyphPositionAdjustments::clearExitPoint(le_int32 index)
++{
++ CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount);
++
++ fEntryExitPoints[index].clearExitPoint();
++}
++
+ void GlyphPositionAdjustments::setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
+ {
+ CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount);
+@@ -152,7 +166,12 @@
+ lastExitGlyphID = glyphID;
+ } else {
+ if (baselineIsLogicalEnd(i) && firstExitPoint >= 0 && lastExitPoint >= 0) {
+- le_int32 limit = lastExitPoint + dir;
++ le_int32 limit = lastExitPoint /*+ dir*/;
++ LEPoint dummyAnchor;
++
++ if (getEntryPoint(i, dummyAnchor) != NULL) {
++ limit += dir;
++ }
+
+ for (le_int32 j = firstExitPoint; j != limit; j += dir) {
+ if (isCursiveGlyph(j)) {
+diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.h b/src/share/native/sun/font/layout/GlyphPositionAdjustments.h
+--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h
++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h
+@@ -97,6 +97,8 @@
+ LEPoint *getEntryPoint(LEPoint &entryPoint) const;
+ LEPoint *getExitPoint(LEPoint &exitPoint) const;
+
++ inline void clearEntryPoint();
++ inline void clearExitPoint();
+ inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
+ inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
+ inline void setCursiveGlyph(le_bool baselineIsLogicalEnd);
+@@ -151,6 +153,8 @@
+ inline void adjustXAdvance(le_int32 index, float xAdjustment);
+ inline void adjustYAdvance(le_int32 index, float yAdjustment);
+
++ void clearEntryPoint(le_int32 index);
++ void clearExitPoint(le_int32 index);
+ void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
+ void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
+ void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd);
+@@ -266,6 +270,16 @@
+ return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0;
+ }
+
++inline void GlyphPositionAdjustments::EntryExitPoint::clearEntryPoint()
++{
++ fFlags &= ~EEF_HAS_ENTRY_POINT;
++}
++
++inline void GlyphPositionAdjustments::EntryExitPoint::clearExitPoint()
++{
++ fFlags &= ~EEF_HAS_EXIT_POINT;
++}
++
+ inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
+ {
+ if (baselineIsLogicalEnd) {
+diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.cpp b/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
+@@ -43,12 +43,19 @@
+
+ void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft,
+ LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success,
+ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const
+ {
+- GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder);
++ if (LE_FAILURE(success)) {
++ return;
++ }
+
+- processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance);
++ GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success);
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
++ processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance, success);
+
+ glyphPositionAdjustments->applyCursiveAdjustments(glyphStorage, rightToLeft, fontInstance);
+ }
+diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.h b/src/share/native/sun/font/layout/GlyphPositioningTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h
+@@ -53,7 +53,7 @@
+ {
+ void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+ le_bool rightToLeft, LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success,
+ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const;
+ };
+
+diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp b/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
+@@ -31,7 +31,7 @@
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+-#include "Features.h"
++#include "ICUFeatures.h"
+ #include "Lookups.h"
+ #include "ScriptAndLanguage.h"
+ #include "GlyphDefinitionTables.h"
+@@ -58,13 +58,24 @@
+
+ GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor(
+ const GlyphPositioningTableHeader *glyphPositioningTableHeader,
+- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder)
++ LETag scriptTag,
++ LETag languageTag,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool featureOrder,
++ LEErrorCode& success)
+ : LookupProcessor(
+ (char *) glyphPositioningTableHeader,
+ SWAPW(glyphPositioningTableHeader->scriptListOffset),
+ SWAPW(glyphPositioningTableHeader->featureListOffset),
+ SWAPW(glyphPositioningTableHeader->lookupListOffset),
+- scriptTag, languageTag, featureMap, featureMapCount, featureOrder)
++ scriptTag,
++ languageTag,
++ featureMap,
++ featureMapCount,
++ featureOrder,
++ success
++ )
+ {
+ // anything?
+ }
+@@ -75,8 +86,13 @@
+
+ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType,
+ GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++ const LEFontInstance *fontInstance,
++ LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_uint32 delta = 0;
+
+ switch(lookupType)
+@@ -136,7 +152,7 @@
+ {
+ const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable;
+
+- delta = subtable->process(this, glyphIterator, fontInstance);
++ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+ }
+
+@@ -144,7 +160,7 @@
+ {
+ const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable;
+
+- delta = subtable->process(this, glyphIterator, fontInstance);
++ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+ }
+
+@@ -152,7 +168,7 @@
+ {
+ const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable;
+
+- delta = subtable->process(this, lookupType, glyphIterator, fontInstance);
++ delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success);
+ break;
+ }
+
+diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.h b/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
+--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
+@@ -40,7 +40,7 @@
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+ #include "Lookups.h"
+-#include "Features.h"
++#include "ICUFeatures.h"
+ #include "GlyphDefinitionTables.h"
+ #include "GlyphPositioningTables.h"
+ #include "GlyphIterator.h"
+@@ -52,12 +52,17 @@
+ {
+ public:
+ GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader,
+- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder);
++ LETag scriptTag,
++ LETag languageTag,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool featureOrder,
++ LEErrorCode& success);
+
+ virtual ~GlyphPositioningLookupProcessor();
+
+ virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const;
++ const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+ protected:
+ GlyphPositioningLookupProcessor();
+diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp b/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
+@@ -33,7 +33,7 @@
+ #include "LEGlyphFilter.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+-#include "Features.h"
++#include "ICUFeatures.h"
+ #include "Lookups.h"
+ #include "ScriptAndLanguage.h"
+ #include "GlyphDefinitionTables.h"
+@@ -52,13 +52,19 @@
+
+ GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor(
+ const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader,
+- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder)
++ LETag scriptTag,
++ LETag languageTag,
++ const LEGlyphFilter *filter,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool featureOrder,
++ LEErrorCode& success)
+ : LookupProcessor(
+ (char *) glyphSubstitutionTableHeader,
+ SWAPW(glyphSubstitutionTableHeader->scriptListOffset),
+ SWAPW(glyphSubstitutionTableHeader->featureListOffset),
+ SWAPW(glyphSubstitutionTableHeader->lookupListOffset),
+- scriptTag, languageTag, featureMap, featureMapCount, featureOrder), fFilter(filter)
++ scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success), fFilter(filter)
+ {
+ // anything?
+ }
+@@ -68,8 +74,12 @@
+ }
+
+ le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType,
+- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_uint32 delta = 0;
+
+ switch(lookupType)
+@@ -89,7 +99,7 @@
+ {
+ const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable;
+
+- delta = subtable->process(glyphIterator, fFilter);
++ delta = subtable->process(glyphIterator, success, fFilter);
+ break;
+ }
+
+@@ -113,7 +123,7 @@
+ {
+ const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable;
+
+- delta = subtable->process(this, glyphIterator, fontInstance);
++ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+ }
+
+@@ -121,7 +131,7 @@
+ {
+ const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable;
+
+- delta = subtable->process(this, glyphIterator, fontInstance);
++ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+ }
+
+@@ -129,7 +139,7 @@
+ {
+ const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable;
+
+- delta = subtable->process(this, lookupType, glyphIterator, fontInstance);
++ delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success);
+ break;
+ }
+
+diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.h b/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
+--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
+@@ -41,7 +41,7 @@
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+ #include "Lookups.h"
+-#include "Features.h"
++#include "ICUFeatures.h"
+ #include "GlyphDefinitionTables.h"
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphIterator.h"
+@@ -53,12 +53,18 @@
+ {
+ public:
+ GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader,
+- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder);
++ LETag scriptTag,
++ LETag languageTag,
++ const LEGlyphFilter *filter,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool featureOrder,
++ LEErrorCode& success);
+
+ virtual ~GlyphSubstitutionLookupProcessor();
+
+ virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const;
++ const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+ protected:
+ GlyphSubstitutionLookupProcessor();
+diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp b/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
+@@ -42,13 +42,23 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag,
++le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage,
++ le_bool rightToLeft,
++ LETag scriptTag,
++ LETag languageTag,
+ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const
++ const LEGlyphFilter *filter,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool featureOrder,
++ LEErrorCode &success) const
+ {
+- GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder);
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
+
+- return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL);
++ GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success);
++ return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL, success);
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.h b/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
+@@ -50,9 +50,16 @@
+
+ struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader
+ {
+- le_int32 process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEGlyphFilter *filter,
+- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const;
++ le_int32 process(LEGlyphStorage &glyphStorage,
++ le_bool rightToLeft,
++ LETag scriptTag,
++ LETag languageTag,
++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const LEGlyphFilter *filter,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool featureOrder,
++ LEErrorCode &success) const;
+ };
+
+ enum GlyphSubstitutionSubtableTypes
+diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.cpp b/src/share/native/sun/font/layout/HanLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp
+@@ -26,7 +26,7 @@
+ /*
+ * HanLayoutEngine.cpp: OpenType processing for Han fonts.
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved.
+ */
+
+ #include "LETypes.h"
+@@ -64,8 +64,8 @@
+ #define features (loclFeatureMask)
+
+ HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = featureMap;
+ fFeatureMapCount = featureMapCount;
+diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.h b/src/share/native/sun/font/layout/HanLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.h
+@@ -27,7 +27,7 @@
+ /*
+ * HanLayoutEngine.h: OpenType processing for Han fonts.
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved.
+ */
+
+ #ifndef __HANLAYOUTENGINE_H
+@@ -64,6 +64,7 @@
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
+ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LayoutEngine::layoutEngineFactory
+ * @see OpenTypeLayoutEngine
+@@ -72,7 +73,7 @@
+ * @internal
+ */
+ HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTablem, LEErrorCode &success);
+
+
+ /**
+diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.cpp b/src/share/native/sun/font/layout/HangulLayoutEngine.cpp
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.cpp
+@@ -0,0 +1,363 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ * HangulLayoutEngine.cpp: OpenType processing for Han fonts.
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved.
++ */
++
++#include "LETypes.h"
++#include "LEScripts.h"
++#include "LELanguages.h"
++
++#include "LayoutEngine.h"
++#include "OpenTypeLayoutEngine.h"
++#include "HangulLayoutEngine.h"
++#include "ScriptAndLanguageTags.h"
++#include "LEGlyphStorage.h"
++#include "OpenTypeTables.h"
++
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HangulOpenTypeLayoutEngine)
++
++
++#define FEATURE_MAP(name) {name ## FeatureTag, name ## FeatureMask}
++
++#define LJMO_FIRST 0x1100
++#define LJMO_LAST 0x1159
++#define LJMO_FILL 0x115F
++#define LJMO_COUNT 19
++
++#define VJMO_FIRST 0x1161
++#define VJMO_LAST 0x11A2
++#define VJMO_FILL 0x1160
++#define VJMO_COUNT 21
++
++#define TJMO_FIRST 0x11A7
++#define TJMO_LAST 0x11F9
++#define TJMO_COUNT 28
++
++#define HSYL_FIRST 0xAC00
++#define HSYL_COUNT 11172
++#define HSYL_LVCNT (VJMO_COUNT * TJMO_COUNT)
++
++// Character classes
++enum
++{
++ CC_L = 0,
++ CC_V,
++ CC_T,
++ CC_LV,
++ CC_LVT,
++ CC_X,
++ CC_COUNT
++};
++
++// Action flags
++#define AF_L 1
++#define AF_V 2
++#define AF_T 4
++
++// Actions
++#define a_N 0
++#define a_L (AF_L)
++#define a_V (AF_V)
++#define a_T (AF_T)
++#define a_VT (AF_V | AF_T)
++#define a_LV (AF_L | AF_V)
++#define a_LVT (AF_L | AF_V | AF_T)
++
++typedef struct
++{
++ le_int32 newState;
++ le_int32 actionFlags;
++} StateTransition;
++
++static const StateTransition stateTable[][CC_COUNT] =
++{
++// L V T LV LVT X
++ { {1, a_L}, {2, a_LV}, {3, a_LVT}, {2, a_LV}, {3, a_LVT}, {4, a_T}}, // 0 - start
++ { {1, a_L}, {2, a_V}, {3, a_VT}, {2, a_LV}, {3, a_LVT}, {-1, a_V}}, // 1 - L+
++ {{-1, a_N}, {2, a_V}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 2 - L+V+
++ {{-1, a_N}, {-1, a_N}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 3 - L+V+T*
++ {{-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {4, a_T}} // 4 - X+
++};
++
++
++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG
++#define ljmoFeatureTag LE_LJMO_FEATURE_TAG
++#define vjmoFeatureTag LE_VJMO_FEATURE_TAG
++#define tjmoFeatureTag LE_TJMO_FEATURE_TAG
++
++#define ccmpFeatureMask 0x80000000UL
++#define ljmoFeatureMask 0x40000000UL
++#define vjmoFeatureMask 0x20000000UL
++#define tjmoFeatureMask 0x10000000UL
++
++static const FeatureMap featureMap[] =
++{
++ {ccmpFeatureTag, ccmpFeatureMask},
++ {ljmoFeatureTag, ljmoFeatureMask},
++ {vjmoFeatureTag, vjmoFeatureMask},
++ {tjmoFeatureTag, tjmoFeatureMask}
++};
++
++static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap);
++
++#define nullFeatures 0
++#define ljmoFeatures (ccmpFeatureMask | ljmoFeatureMask)
++#define vjmoFeatures (ccmpFeatureMask | vjmoFeatureMask | ljmoFeatureMask | tjmoFeatureMask)
++#define tjmoFeatures (ccmpFeatureMask | tjmoFeatureMask | ljmoFeatureMask | vjmoFeatureMask)
++
++static le_int32 compose(LEUnicode lead, LEUnicode vowel, LEUnicode trail, LEUnicode &syllable)
++{
++ le_int32 lIndex = lead - LJMO_FIRST;
++ le_int32 vIndex = vowel - VJMO_FIRST;
++ le_int32 tIndex = trail - TJMO_FIRST;
++ le_int32 result = 3;
++
++ if ((lIndex < 0 || lIndex >= LJMO_COUNT ) || (vIndex < 0 || vIndex >= VJMO_COUNT)) {
++ return 0;
++ }
++
++ if (tIndex <= 0 || tIndex >= TJMO_COUNT) {
++ tIndex = 0;
++ result = 2;
++ }
++
++ syllable = (LEUnicode) ((lIndex * VJMO_COUNT + vIndex) * TJMO_COUNT + tIndex + HSYL_FIRST);
++
++ return result;
++}
++
++static le_int32 decompose(LEUnicode syllable, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail)
++{
++ le_int32 sIndex = syllable - HSYL_FIRST;
++
++ if (sIndex < 0 || sIndex >= HSYL_COUNT) {
++ return 0;
++ }
++
++ lead = LJMO_FIRST + (sIndex / HSYL_LVCNT);
++ vowel = VJMO_FIRST + (sIndex % HSYL_LVCNT) / TJMO_COUNT;
++ trail = TJMO_FIRST + (sIndex % TJMO_COUNT);
++
++ if (trail == TJMO_FIRST) {
++ return 2;
++ }
++
++ return 3;
++}
++
++static le_int32 getCharClass(LEUnicode ch, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail)
++{
++ lead = LJMO_FILL;
++ vowel = VJMO_FILL;
++ trail = TJMO_FIRST;
++
++ if (ch >= LJMO_FIRST && ch <= LJMO_LAST) {
++ lead = ch;
++ return CC_L;
++ }
++
++ if (ch >= VJMO_FIRST && ch <= VJMO_LAST) {
++ vowel = ch;
++ return CC_V;
++ }
++
++ if (ch > TJMO_FIRST && ch <= TJMO_LAST) {
++ trail = ch;
++ return CC_T;
++ }
++
++ le_int32 c = decompose(ch, lead, vowel, trail);
++
++ if (c == 2) {
++ return CC_LV;
++ }
++
++ if (c == 3) {
++ return CC_LVT;
++ }
++
++ trail = ch;
++ return CC_X;
++}
++
++HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, gsubTable, success)
++{
++ fFeatureMap = featureMap;
++ fFeatureMapCount = featureMapCount;
++ fFeatureOrder = TRUE;
++}
++
++HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/,
++ le_int32 typoFlags, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, success)
++{
++ fFeatureMap = featureMap;
++ fFeatureMapCount = featureMapCount;
++ fFeatureOrder = TRUE;
++}
++
++HangulOpenTypeLayoutEngine::~HangulOpenTypeLayoutEngine()
++{
++ // nothing to do
++}
++
++le_int32 HangulOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++{
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
++ success = LE_ILLEGAL_ARGUMENT_ERROR;
++ return 0;
++ }
++
++ le_int32 worstCase = count * 3;
++
++ outChars = LE_NEW_ARRAY(LEUnicode, worstCase);
++
++ if (outChars == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
++
++ glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success);
++ glyphStorage.allocateAuxData(success);
++
++ if (LE_FAILURE(success)) {
++ LE_DELETE_ARRAY(outChars);
++ return 0;
++ }
++
++ le_int32 outCharCount = 0;
++ le_int32 limit = offset + count;
++ le_int32 i = offset;
++
++ while (i < limit) {
++ le_int32 state = 0;
++ le_int32 inStart = i;
++ le_int32 outStart = outCharCount;
++
++ while( i < limit) {
++ LEUnicode lead = 0;
++ LEUnicode vowel = 0;
++ LEUnicode trail = 0;
++ le_int32 chClass = getCharClass(chars[i], lead, vowel, trail);
++ const StateTransition transition = stateTable[state][chClass];
++
++ if (chClass == CC_X) {
++ /* Any character of type X will be stored as a trail jamo */
++ if ((transition.actionFlags & AF_T) != 0) {
++ outChars[outCharCount] = trail;
++ glyphStorage.setCharIndex(outCharCount, i-offset, success);
++ glyphStorage.setAuxData(outCharCount++, nullFeatures, success);
++ }
++ } else {
++ /* Any Hangul will be fully decomposed. Output the decomposed characters. */
++ if ((transition.actionFlags & AF_L) != 0) {
++ outChars[outCharCount] = lead;
++ glyphStorage.setCharIndex(outCharCount, i-offset, success);
++ glyphStorage.setAuxData(outCharCount++, ljmoFeatures, success);
++ }
++
++ if ((transition.actionFlags & AF_V) != 0) {
++ outChars[outCharCount] = vowel;
++ glyphStorage.setCharIndex(outCharCount, i-offset, success);
++ glyphStorage.setAuxData(outCharCount++, vjmoFeatures, success);
++ }
++
++ if ((transition.actionFlags & AF_T) != 0) {
++ outChars[outCharCount] = trail;
++ glyphStorage.setCharIndex(outCharCount, i-offset, success);
++ glyphStorage.setAuxData(outCharCount++, tjmoFeatures, success);
++ }
++ }
++
++ state = transition.newState;
++
++ /* Negative next state means stop. */
++ if (state < 0) {
++ break;
++ }
++
++ i += 1;
++ }
++
++ le_int32 inLength = i - inStart;
++ le_int32 outLength = outCharCount - outStart;
++
++ /*
++ * See if the syllable can be composed into a single character. There are 5
++ * possible cases:
++ *
++ * Input Decomposed to Compose to
++ * LV L, V LV
++ * LVT L, V, T LVT
++ * L, V L, V LV, DEL
++ * LV, T L, V, T LVT, DEL
++ * L, V, T L, V, T LVT, DEL, DEL
++ */
++ if ((inLength >= 1 && inLength <= 3) && (outLength == 2 || outLength == 3)) {
++ LEUnicode syllable = 0x0000;
++ LEUnicode lead = outChars[outStart];
++ LEUnicode vowel = outChars[outStart + 1];
++ LEUnicode trail = outLength == 3? outChars[outStart + 2] : TJMO_FIRST;
++
++ /*
++ * If the composition consumes the whole decomposed syllable,
++ * we can use it.
++ */
++ if (compose(lead, vowel, trail, syllable) == outLength) {
++ outCharCount = outStart;
++ outChars[outCharCount] = syllable;
++ glyphStorage.setCharIndex(outCharCount, inStart-offset, success);
++ glyphStorage.setAuxData(outCharCount++, nullFeatures, success);
++
++ /*
++ * Replace the rest of the input characters with DEL.
++ */
++ for(le_int32 d = inStart + 1; d < i; d += 1) {
++ outChars[outCharCount] = 0xFFFF;
++ glyphStorage.setCharIndex(outCharCount, d - offset, success);
++ glyphStorage.setAuxData(outCharCount++, nullFeatures, success);
++ }
++ }
++ }
++ }
++
++ glyphStorage.adoptGlyphCount(outCharCount);
++ return outCharCount;
++}
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.h b/src/share/native/sun/font/layout/HangulLayoutEngine.h
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.h
+@@ -0,0 +1,151 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
++ *
++ */
++
++#ifndef __HANGULAYOUTENGINE_H
++#define __HANGULAYOUTENGINE_H
++
++#include "LETypes.h"
++#include "LEFontInstance.h"
++#include "LEGlyphFilter.h"
++#include "LayoutEngine.h"
++#include "OpenTypeLayoutEngine.h"
++
++#include "GlyphSubstitutionTables.h"
++#include "GlyphDefinitionTables.h"
++#include "GlyphPositioningTables.h"
++
++U_NAMESPACE_BEGIN
++
++class MPreFixups;
++class LEGlyphStorage;
++
++/**
++ * This class implements OpenType layout for Old Hangul OpenType fonts, as
++ * specified by Microsoft in "Creating and Supporting OpenType Fonts for
++ * The Korean Hangul Script" (http://www.microsoft.com/typography/otfntdev/hangulot/default.htm)
++ *
++ * This class overrides the characterProcessing method to do Hangul character processing.
++ * (See the MS spec. for more details)
++ *
++ * @internal
++ */
++class HangulOpenTypeLayoutEngine : public OpenTypeLayoutEngine
++{
++public:
++ /**
++ * This is the main constructor. It constructs an instance of HangulOpenTypeLayoutEngine for
++ * a particular font, script and language. It takes the GSUB table as a parameter since
++ * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an
++ * Hangul OpenType font.
++ *
++ * @param fontInstance - the font
++ * @param scriptCode - the script
++ * @param langaugeCode - the language
++ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
++ *
++ * @see LayoutEngine::layoutEngineFactory
++ * @see OpenTypeLayoutEngine
++ * @see ScriptAndLangaugeTags.h for script and language codes
++ *
++ * @internal
++ */
++ HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++
++ /**
++ * This constructor is used when the font requires a "canned" GSUB table which can't be known
++ * until after this constructor has been invoked.
++ *
++ * @param fontInstance - the font
++ * @param scriptCode - the script
++ * @param langaugeCode - the language
++ * @param success - set to an error code if the operation fails
++ *
++ * @see OpenTypeLayoutEngine
++ * @see ScriptAndLangaugeTags.h for script and language codes
++ *
++ * @internal
++ */
++ HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, LEErrorCode &success);
++
++ /**
++ * The destructor, virtual for correct polymorphic invocation.
++ *
++ * @internal
++ */
++ virtual ~HangulOpenTypeLayoutEngine();
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @stable ICU 2.8
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @stable ICU 2.8
++ */
++ static UClassID getStaticClassID();
++
++protected:
++
++ /**
++ * This method does Hangul OpenType character processing. It assigns the OpenType feature
++ * tags to the characters, and may compose a character sequence into a modern Hangul syllable,
++ * or decompose a modern Hangul syllable if it forms part of an old Hangul syllable.
++ *
++ * Input parameters:
++ * @param chars - the input character context
++ * @param offset - the index of the first character to process
++ * @param count - the number of characters to process
++ * @param max - the number of characters in the input context
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set.
++ * the auxillary data array will be set to the feature tags.
++ *
++ * Output parameters:
++ * @param success - set to an error code if the operation fails
++ *
++ * @return the output character count
++ *
++ * @internal
++ */
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++};
++
++U_NAMESPACE_END
++#endif
++
+diff --git a/src/share/native/sun/font/layout/HebrewLigatureData.cpp b/src/share/native/sun/font/layout/HebrewLigatureData.cpp
+deleted file mode 100644
+--- jdk/src/share/native/sun/font/layout/HebrewLigatureData.cpp
++++ /dev/null
+@@ -1,80 +0,0 @@
+-/*
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * This code is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License version 2 only, as
+- * published by the Free Software Foundation. Oracle designates this
+- * particular file as subject to the "Classpath" exception as provided
+- * by Oracle in the LICENSE file that accompanied this code.
+- *
+- * This code is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+- * version 2 for more details (a copy is included in the LICENSE file that
+- * accompanied this code).
+- *
+- * You should have received a copy of the GNU General Public License version
+- * 2 along with this work; if not, write to the Free Software Foundation,
+- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+- *
+- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+- * or visit www.oracle.com if you need additional information or have any
+- * questions.
+- *
+- */
+-
+-/*
+- *
+- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
+- *
+- * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+- * YOU REALLY KNOW WHAT YOU'RE DOING.
+- *
+- */
+-
+-#include "LETypes.h"
+-#include "HebrewShaping.h"
+-
+-const le_uint8 HebrewShaping::glyphSubstitutionTable[] = {
+- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x00, 0x2C, 0x00, 0x01, 0x68, 0x65, 0x62, 0x72,
+- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+- 0x6C, 0x69, 0x67, 0x61, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04,
+- 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x62, 0x00, 0x16, 0x00, 0x32,
+- 0x00, 0x4C, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2,
+- 0x00, 0xAC, 0x00, 0xB6, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xFA,
+- 0x01, 0x0C, 0x01, 0x16, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x58, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E,
+- 0x00, 0x14, 0xFB, 0x2E, 0x00, 0x02, 0x05, 0xB7, 0xFB, 0x2F, 0x00, 0x02, 0x05, 0xB8, 0xFB, 0x30,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x31, 0x00, 0x02, 0x05, 0xBC,
+- 0xFB, 0x4C, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x32, 0x00, 0x02, 0x05, 0xBC,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x33, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x34,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x4B, 0x00, 0x02, 0x05, 0xB9,
+- 0xFB, 0x35, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x36, 0x00, 0x02, 0x05, 0xBC,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x38, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x39,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02,
+- 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x3B, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4D, 0x00, 0x02, 0x05, 0xBF,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3C, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3E,
+- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x40, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01,
+- 0x00, 0x04, 0xFB, 0x41, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x43, 0x00, 0x02,
+- 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x44, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4E,
+- 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x46, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01,
+- 0x00, 0x04, 0xFB, 0x47, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x48, 0x00, 0x02,
+- 0x05, 0xBC, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFB, 0x2C,
+- 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC1, 0xFB, 0x2D, 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC2, 0xFB, 0x49,
+- 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x2A, 0x00, 0x02, 0x05, 0xC1, 0xFB, 0x2B, 0x00, 0x02, 0x05, 0xC2,
+- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x4A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x16, 0x05, 0xD0,
+- 0x05, 0xD1, 0x05, 0xD2, 0x05, 0xD3, 0x05, 0xD4, 0x05, 0xD5, 0x05, 0xD6, 0x05, 0xD8, 0x05, 0xD9,
+- 0x05, 0xDA, 0x05, 0xDB, 0x05, 0xDC, 0x05, 0xDE, 0x05, 0xE0, 0x05, 0xE1, 0x05, 0xE3, 0x05, 0xE4,
+- 0x05, 0xE6, 0x05, 0xE7, 0x05, 0xE8, 0x05, 0xE9, 0x05, 0xEA
+-};
+-
+-const le_uint8 HebrewShaping::glyphDefinitionTable[] = {
+- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15,
+- 0x05, 0x91, 0x05, 0xA1, 0x00, 0x03, 0x05, 0xA3, 0x05, 0xB9, 0x00, 0x03, 0x05, 0xBB, 0x05, 0xBD,
+- 0x00, 0x03, 0x05, 0xBE, 0x05, 0xBE, 0x00, 0x01, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x03, 0x05, 0xC0,
+- 0x05, 0xC0, 0x00, 0x01, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x03, 0x05, 0xC3, 0x05, 0xC3, 0x00, 0x01,
+- 0x05, 0xC4, 0x05, 0xC4, 0x00, 0x03, 0x05, 0xD0, 0x05, 0xEA, 0x00, 0x01, 0x05, 0xF0, 0x05, 0xF2,
+- 0x00, 0x02, 0x05, 0xF3, 0x05, 0xF4, 0x00, 0x01, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x03, 0xFB, 0x1F,
+- 0xFB, 0x1F, 0x00, 0x02, 0xFB, 0x20, 0xFB, 0x36, 0x00, 0x01, 0xFB, 0x38, 0xFB, 0x3C, 0x00, 0x01,
+- 0xFB, 0x3E, 0xFB, 0x3E, 0x00, 0x01, 0xFB, 0x40, 0xFB, 0x41, 0x00, 0x01, 0xFB, 0x43, 0xFB, 0x44,
+- 0x00, 0x01, 0xFB, 0x46, 0xFB, 0x4E, 0x00, 0x01, 0xFB, 0x4F, 0xFB, 0x4F, 0x00, 0x02
+-};
+diff --git a/src/share/native/sun/font/layout/HebrewShaping.cpp b/src/share/native/sun/font/layout/HebrewShaping.cpp
+deleted file mode 100644
+--- jdk/src/share/native/sun/font/layout/HebrewShaping.cpp
++++ /dev/null
+@@ -1,58 +0,0 @@
+-/*
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * This code is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License version 2 only, as
+- * published by the Free Software Foundation. Oracle designates this
+- * particular file as subject to the "Classpath" exception as provided
+- * by Oracle in the LICENSE file that accompanied this code.
+- *
+- * This code is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+- * version 2 for more details (a copy is included in the LICENSE file that
+- * accompanied this code).
+- *
+- * You should have received a copy of the GNU General Public License version
+- * 2 along with this work; if not, write to the Free Software Foundation,
+- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+- *
+- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+- * or visit www.oracle.com if you need additional information or have any
+- * questions.
+- *
+- */
+-
+-/*
+- *
+- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
+- *
+- */
+-
+-#include "LETypes.h"
+-#include "OpenTypeTables.h"
+-#include "HebrewShaping.h"
+-
+-const LETag ligaFeatureTag = 0x6C696761; // 'liga'
+-const LETag emptyTag = 0x00000000; // ''
+-
+-const LETag hebrewTags[] =
+-{
+- ligaFeatureTag, emptyTag
+-};
+-
+-void HebrewShaping::shape(const LEUnicode * /*chars*/, le_int32 /*offset*/, le_int32 charCount, le_int32 /*charMax*/,
+- le_bool rightToLeft, const LETag **tags)
+-{
+-
+- le_int32 count, out = 0, dir = 1;
+-
+- if (rightToLeft) {
+- out = charCount - 1;
+- dir = -1;
+- }
+-
+- for (count = 0; count < charCount; count += 1, out += dir) {
+- tags[out] = hebrewTags;
+- }
+-}
+diff --git a/src/share/native/sun/font/layout/HebrewShaping.h b/src/share/native/sun/font/layout/HebrewShaping.h
+deleted file mode 100644
+--- jdk/src/share/native/sun/font/layout/HebrewShaping.h
++++ /dev/null
+@@ -1,52 +0,0 @@
+-/*
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * This code is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License version 2 only, as
+- * published by the Free Software Foundation. Oracle designates this
+- * particular file as subject to the "Classpath" exception as provided
+- * by Oracle in the LICENSE file that accompanied this code.
+- *
+- * This code is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+- * version 2 for more details (a copy is included in the LICENSE file that
+- * accompanied this code).
+- *
+- * You should have received a copy of the GNU General Public License version
+- * 2 along with this work; if not, write to the Free Software Foundation,
+- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+- *
+- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+- * or visit www.oracle.com if you need additional information or have any
+- * questions.
+- *
+- */
+-
+-/*
+- *
+- * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved
+- *
+- */
+-
+-#ifndef __HEBREWSHAPING_H
+-#define __HEBREWSHAPING_H
+-
+-#include "LETypes.h"
+-#include "OpenTypeTables.h"
+-
+-class HebrewShaping
+-{
+-public:
+- static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax,
+- le_bool rightToLeft, const LETag **tags);
+-
+- static const le_uint8 glyphSubstitutionTable[];
+- static const le_uint8 glyphDefinitionTable[];
+-
+-private:
+- // forbid instantiation
+- HebrewShaping();
+-};
+-
+-#endif
+diff --git a/src/share/native/sun/font/layout/ICUFeatures.h b/src/share/native/sun/font/layout/ICUFeatures.h
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/ICUFeatures.h
+@@ -0,0 +1,69 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
++ *
++ */
++
++#ifndef __ICUFEATURES_H
++#define __ICUFEATURES_H
++
++/**
++ * \file
++ * \internal
++ */
++
++#include "LETypes.h"
++#include "OpenTypeTables.h"
++
++U_NAMESPACE_BEGIN
++
++struct FeatureRecord
++{
++ ATag featureTag;
++ Offset featureTableOffset;
++};
++
++struct FeatureTable
++{
++ Offset featureParamsOffset;
++ le_uint16 lookupCount;
++ le_uint16 lookupListIndexArray[ANY_NUMBER];
++};
++
++struct FeatureListTable
++{
++ le_uint16 featureCount;
++ FeatureRecord featureRecordArray[ANY_NUMBER];
++
++ const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const;
++
++ const FeatureTable *getFeatureTable(LETag featureTag) const;
++};
++
++U_NAMESPACE_END
++#endif
+diff --git a/src/share/native/sun/font/layout/IndicClassTables.cpp b/src/share/native/sun/font/layout/IndicClassTables.cpp
+--- jdk/src/share/native/sun/font/layout/IndicClassTables.cpp
++++ jdk/src/share/native/sun/font/layout/IndicClassTables.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -73,6 +73,7 @@
+ #define _m2 (CC_SPLIT_VOWEL_PIECE_2 | CF_LENGTH_MARK)
+ #define _m3 (CC_SPLIT_VOWEL_PIECE_3 | CF_LENGTH_MARK)
+ #define _vr (CC_VIRAMA)
++#define _al (CC_AL_LAKUNA)
+
+ // split matras
+ #define _s1 (_dv | _x1)
+@@ -90,6 +91,7 @@
+ // special forms... (Bengali RA?)
+ #define _bb (_ct | CF_BELOW_BASE)
+ #define _pb (_ct | CF_POST_BASE)
++#define _fb (_ct | CF_PRE_BASE)
+ #define _vt (_bb | CF_VATTU)
+ #define _rv (_vt | CF_REPH)
+ #define _rp (_pb | CF_REPH)
+@@ -119,7 +121,7 @@
+ _dr, _db, _db, _db, _db, _xx, _xx, _l1, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF
+ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF
+ _iv, _iv, _dv, _dv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 09E0 - 09EF
+- _ct, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA
++ _rv, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA
+ };
+
+ static const IndicClassTable::CharClass punjCharClasses[] =
+@@ -142,9 +144,22 @@
+ _rv, _xx, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0AB0 - 0ABF
+ _dr, _db, _db, _db, _db, _da, _xx, _da, _da, _dr, _xx, _dr, _dr, _vr, _xx, _xx, // 0AC0 - 0ACF
+ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0AD0 - 0ADF
+- _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0AE0 - 0AEF
++ _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0AE0 - 0AEF
+ };
+
++#if 1
++static const IndicClassTable::CharClass oryaCharClasses[] =
++{
++ _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, /* 0B00 - 0B0F */
++ _iv, _xx, _xx, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _ct, _bb, /* 0B10 - 0B1F */
++ _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _pb, /* 0B20 - 0B2F */
++ _rb, _xx, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _nu, _xx, _dr, _da, /* 0B30 - 0B3F */
++ _dr, _db, _db, _db, _xx, _xx, _xx, _dl, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, /* 0B40 - 0B4F */
++ _xx, _xx, _xx, _xx, _xx, _xx, _da, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _pb, /* 0B50 - 0B5F */
++ _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0B60 - 0B6F */
++ _xx, _bb /* 0B70 - 0B71 */
++};
++#else
+ static const IndicClassTable::CharClass oryaCharClasses[] =
+ {
+ _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0B00 - 0B0F
+@@ -156,13 +171,14 @@
+ _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0B60 - 0B6F
+ _xx, _ct // 0B70 - 0B71
+ };
++#endif
+
+ static const IndicClassTable::CharClass tamlCharClasses[] =
+ {
+- _xx, _xx, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F
++ _xx, _xx, _ma, _xx, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F
+ _iv, _xx, _iv, _iv, _iv, _ct, _xx, _xx, _xx, _ct, _ct, _xx, _ct, _xx, _ct, _ct, // 0B90 - 0B9F
+ _xx, _xx, _xx, _ct, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _ct, _ct, // 0BA0 - 0BAF
+- _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF
++ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF
+ _da, _dr, _dr, _xx, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0BC0 - 0BCF
+ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BD0 - 0BDF
+ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BE0 - 0BEF
+@@ -175,7 +191,7 @@
+ _xx, _mp, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C00 - 0C0F
+ _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C10 - 0C1F
+ _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0C20 - 0C2F
+- _bb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F
++ _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F
+ _da, _dr, _dr, _dr, _dr, _xx, _a1, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, // 0C40 - 0C4F
+ _xx, _xx, _xx, _xx, _xx, _da, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F
+ _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0C60 - 0C6F
+@@ -189,7 +205,7 @@
+ // http://brahmi.sourceforge.net/docs/KannadaComputing.html
+ static const IndicClassTable::CharClass kndaCharClasses[] =
+ {
+- _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, // 0C80 - 0C8F
++ _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C80 - 0C8F
+ _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C90 - 0C9F
+ _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0CA0 - 0CAF
+ _rb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _dr, _da, // 0CB0 - 0CBF
+@@ -203,9 +219,9 @@
+ static const IndicClassTable::CharClass mlymCharClasses[] =
+ {
+ _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0D00 - 0D0F
+- _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _bb, // 0D10 - 0D1F
+- _ct, _ct, _ct, _bb, _ct, _bb, _bb, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F
+- _pb, _cn, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F
++ _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0D10 - 0D1F
++ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F
++ _fb, _fb, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F
+ _dr, _dr, _dr, _dr, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F
+ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F
+ _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0D60 - 0D6F
+@@ -217,7 +233,7 @@
+ _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D90 - 0D9F
+ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0DA0 - 0DAF
+ _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _xx, _xx, // 0DB0 - 0DBF
+- _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _vr, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF
++ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _al, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF
+ _dr, _dr, _da, _da, _db, _xx, _db, _xx, _dr, _dl, _s1, _dl, _s2, _s3, _s4, _dr, // 0DD0 - 0DDF
+ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0DE0 - 0DEF
+ _xx, _xx, _dr, _dr, _xx // 0DF0 - 0DF4
+@@ -248,17 +264,18 @@
+
+ // FIXME: post 'GSUB' reordering of MATRA_PRE's for Malayalam and Tamil
+ // FIXME: reformed Malayalam needs to reorder VATTU to before base glyph...
++// FIXME: not sure passing ZWJ/ZWNJ is best way to render Malayalam Cillu...
+ // FIXME: eyelash RA only for Devanagari??
+-#define DEVA_SCRIPT_FLAGS (SF_EYELASH_RA | SF_NO_POST_BASE_LIMIT)
+-#define BENG_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT)
+-#define PUNJ_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT)
+-#define GUJR_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT)
+-#define ORYA_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT)
+-#define TAML_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
+-#define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3)
+-#define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3)
+-#define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
+-#define SINH_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
++#define DEVA_SCRIPT_FLAGS (SF_EYELASH_RA | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH)
++#define BENG_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH)
++#define PUNJ_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH)
++#define GUJR_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH)
++#define ORYA_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH)
++#define TAML_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH)
++#define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3)
++#define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3)
++#define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT /*| SF_FILTER_ZERO_WIDTH*/)
++#define SINH_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT)
+
+ //
+ // Indic Class Tables
+@@ -286,7 +303,7 @@
+ //
+ // IndicClassTable addresses
+ //
+-static const IndicClassTable * const indicClassTables[] = {
++static const IndicClassTable * const indicClassTables[scriptCodeCount] = {
+ NULL, /* 'zyyy' (COMMON) */
+ NULL, /* 'qaai' (INHERITED) */
+ NULL, /* 'arab' (ARABIC) */
+@@ -348,7 +365,79 @@
+ NULL, /* 'sylo' (SYLOTI_NAGRI) */
+ NULL, /* 'talu' (NEW_TAI_LUE) */
+ NULL, /* 'tfng' (TIFINAGH) */
+- NULL /* 'xpeo' (OLD_PERSIAN) */
++ NULL, /* 'xpeo' (OLD_PERSIAN) */
++ NULL, /* 'bali' (BALINESE) */
++ NULL, /* 'batk' (BATK) */
++ NULL, /* 'blis' (BLIS) */
++ NULL, /* 'brah' (BRAH) */
++ NULL, /* 'cham' (CHAM) */
++ NULL, /* 'cirt' (CIRT) */
++ NULL, /* 'cyrs' (CYRS) */
++ NULL, /* 'egyd' (EGYD) */
++ NULL, /* 'egyh' (EGYH) */
++ NULL, /* 'egyp' (EGYP) */
++ NULL, /* 'geok' (GEOK) */
++ NULL, /* 'hans' (HANS) */
++ NULL, /* 'hant' (HANT) */
++ NULL, /* 'hmng' (HMNG) */
++ NULL, /* 'hung' (HUNG) */
++ NULL, /* 'inds' (INDS) */
++ NULL, /* 'java' (JAVA) */
++ NULL, /* 'kali' (KALI) */
++ NULL, /* 'latf' (LATF) */
++ NULL, /* 'latg' (LATG) */
++ NULL, /* 'lepc' (LEPC) */
++ NULL, /* 'lina' (LINA) */
++ NULL, /* 'mand' (MAND) */
++ NULL, /* 'maya' (MAYA) */
++ NULL, /* 'mero' (MERO) */
++ NULL, /* 'nko ' (NKO) */
++ NULL, /* 'orkh' (ORKH) */
++ NULL, /* 'perm' (PERM) */
++ NULL, /* 'phag' (PHAGS_PA) */
++ NULL, /* 'phnx' (PHOENICIAN) */
++ NULL, /* 'plrd' (PLRD) */
++ NULL, /* 'roro' (RORO) */
++ NULL, /* 'sara' (SARA) */
++ NULL, /* 'syre' (SYRE) */
++ NULL, /* 'syrj' (SYRJ) */
++ NULL, /* 'syrn' (SYRN) */
++ NULL, /* 'teng' (TENG) */
++ NULL, /* 'vai ' (VAII) */
++ NULL, /* 'visp' (VISP) */
++ NULL, /* 'xsux' (CUNEIFORM) */
++ NULL, /* 'zxxx' (ZXXX) */
++ NULL, /* 'zzzz' (UNKNOWN) */
++ NULL, /* 'cari' (CARI) */
++ NULL, /* 'jpan' (JPAN) */
++ NULL, /* 'lana' (LANA) */
++ NULL, /* 'lyci' (LYCI) */
++ NULL, /* 'lydi' (LYDI) */
++ NULL, /* 'olck' (OLCK) */
++ NULL, /* 'rjng' (RJNG) */
++ NULL, /* 'saur' (SAUR) */
++ NULL, /* 'sgnw' (SGNW) */
++ NULL, /* 'sund' (SUND) */
++ NULL, /* 'moon' (MOON) */
++ NULL, /* 'mtei' (MTEI) */
++ NULL, /* 'armi' (ARMI) */
++ NULL, /* 'avst' (AVST) */
++ NULL, /* 'cakm' (CAKM) */
++ NULL, /* 'kore' (KORE) */
++ NULL, /* 'kthi' (KTHI) */
++ NULL, /* 'mani' (MANI) */
++ NULL, /* 'phli' (PHLI) */
++ NULL, /* 'phlp' (PHLP) */
++ NULL, /* 'phlv' (PHLV) */
++ NULL, /* 'prti' (PRTI) */
++ NULL, /* 'samr' (SAMR) */
++ NULL, /* 'tavt' (TAVT) */
++ NULL, /* 'zmth' (ZMTH) */
++ NULL, /* 'zsym' (ZSYM) */
++ NULL, /* 'bamu' (BAMUM) */
++ NULL, /* 'lisu' (LISU) */
++ NULL, /* 'nkgb' (NKGB) */
++ NULL /* 'sarb' (OLD_SOUTH_ARABIAN) */
+ };
+
+ IndicClassTable::CharClass IndicClassTable::getCharClass(LEUnicode ch) const
+@@ -388,4 +477,15 @@
+ return classTable->getWorstCaseExpansion();
+ }
+
++le_bool IndicReordering::getFilterZeroWidth(le_int32 scriptCode)
++{
++ const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode);
++
++ if (classTable == NULL) {
++ return TRUE;
++ }
++
++ return classTable->getFilterZeroWidth();
++}
++
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved
+ *
+ */
+
+@@ -44,24 +44,31 @@
+ #include "LEGlyphStorage.h"
+
+ #include "IndicReordering.h"
+-
++#include <stdio.h>
+ U_NAMESPACE_BEGIN
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine)
+
+ IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable), fMPreFixups(NULL)
++ le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL)
++{
++ if ( version2 ) {
++ fFeatureMap = IndicReordering::getv2FeatureMap(fFeatureMapCount);
++ } else {
++ fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
++ }
++ fFeatureOrder = TRUE;
++ fVersion2 = version2;
++ fFilterZeroWidth = IndicReordering::getFilterZeroWidth(fScriptCode);
++}
++
++IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMPreFixups(NULL)
+ {
+ fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+-}
+-
+-IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fMPreFixups(NULL)
+-{
+- fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
+- fFeatureOrder = TRUE;
++ fVersion2 = FALSE;
+ }
+
+ IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine()
+@@ -89,8 +96,13 @@
+ return 0;
+ }
+
+- IndicReordering::adjustMPres(fMPreFixups, glyphStorage);
+-
++ if (fVersion2) {
++ IndicReordering::finalReordering(glyphStorage,retCount);
++ IndicReordering::applyPresentationForms(glyphStorage,retCount);
++ OpenTypeLayoutEngine::glyphSubstitution(count,max, rightToLeft, glyphStorage, success);
++ } else {
++ IndicReordering::adjustMPres(fMPreFixups, glyphStorage, success);
++ }
+ return retCount;
+ }
+
+@@ -128,7 +140,18 @@
+
+ // NOTE: assumes this allocates featureTags...
+ // (probably better than doing the worst case stuff here...)
+- le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups);
++
++ le_int32 outCharCount;
++ if (fVersion2) {
++ outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage);
++ } else {
++ outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success);
++ }
++
++ if (LE_FAILURE(success)) {
++ LE_DELETE_ARRAY(outChars);
++ return 0;
++ }
+
+ glyphStorage.adoptGlyphCount(outCharCount);
+ return outCharCount;
+diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.h b/src/share/native/sun/font/layout/IndicLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved
+ *
+ */
+
+@@ -72,6 +72,7 @@
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
+ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LayoutEngine::layoutEngineFactory
+ * @see OpenTypeLayoutEngine
+@@ -80,7 +81,7 @@
+ * @internal
+ */
+ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -89,6 +90,7 @@
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
++ * @param success - set to an error code if the operation fails
+ *
+ * @see OpenTypeLayoutEngine
+ * @see ScriptAndLangaugeTags.h for script and language codes
+@@ -96,7 +98,7 @@
+ * @internal
+ */
+ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags);
++ le_int32 typoFlags, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -177,9 +179,12 @@
+ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
++ le_bool fVersion2;
++
+ private:
+
+ MPreFixups *fMPreFixups;
++
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicReordering.cpp b/src/share/native/sun/font/layout/IndicReordering.cpp
+--- jdk/src/share/native/sun/font/layout/IndicReordering.cpp
++++ jdk/src/share/native/sun/font/layout/IndicReordering.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved
+ *
+ */
+
+@@ -38,10 +38,12 @@
+
+ U_NAMESPACE_BEGIN
+
++#define loclFeatureTag LE_LOCL_FEATURE_TAG
+ #define initFeatureTag LE_INIT_FEATURE_TAG
+ #define nuktFeatureTag LE_NUKT_FEATURE_TAG
+ #define akhnFeatureTag LE_AKHN_FEATURE_TAG
+ #define rphfFeatureTag LE_RPHF_FEATURE_TAG
++#define rkrfFeatureTag LE_RKRF_FEATURE_TAG
+ #define blwfFeatureTag LE_BLWF_FEATURE_TAG
+ #define halfFeatureTag LE_HALF_FEATURE_TAG
+ #define pstfFeatureTag LE_PSTF_FEATURE_TAG
+@@ -51,30 +53,69 @@
+ #define abvsFeatureTag LE_ABVS_FEATURE_TAG
+ #define pstsFeatureTag LE_PSTS_FEATURE_TAG
+ #define halnFeatureTag LE_HALN_FEATURE_TAG
+-
++#define cjctFeatureTag LE_CJCT_FEATURE_TAG
+ #define blwmFeatureTag LE_BLWM_FEATURE_TAG
+ #define abvmFeatureTag LE_ABVM_FEATURE_TAG
+ #define distFeatureTag LE_DIST_FEATURE_TAG
++#define caltFeatureTag LE_CALT_FEATURE_TAG
++#define kernFeatureTag LE_KERN_FEATURE_TAG
+
+-#define rphfFeatureMask 0x80000000UL
+-#define blwfFeatureMask 0x40000000UL
+-#define halfFeatureMask 0x20000000UL
+-#define pstfFeatureMask 0x10000000UL
+-#define nuktFeatureMask 0x08000000UL
+-#define akhnFeatureMask 0x04000000UL
+-#define vatuFeatureMask 0x02000000UL
+-#define presFeatureMask 0x01000000UL
+-#define blwsFeatureMask 0x00800000UL
+-#define abvsFeatureMask 0x00400000UL
+-#define pstsFeatureMask 0x00200000UL
+-#define halnFeatureMask 0x00100000UL
+-#define blwmFeatureMask 0x00080000UL
+-#define abvmFeatureMask 0x00040000UL
+-#define distFeatureMask 0x00020000UL
+-#define initFeatureMask 0x00010000UL
++#define loclFeatureMask 0x80000000UL
++#define rphfFeatureMask 0x40000000UL
++#define blwfFeatureMask 0x20000000UL
++#define halfFeatureMask 0x10000000UL
++#define pstfFeatureMask 0x08000000UL
++#define nuktFeatureMask 0x04000000UL
++#define akhnFeatureMask 0x02000000UL
++#define vatuFeatureMask 0x01000000UL
++#define presFeatureMask 0x00800000UL
++#define blwsFeatureMask 0x00400000UL
++#define abvsFeatureMask 0x00200000UL
++#define pstsFeatureMask 0x00100000UL
++#define halnFeatureMask 0x00080000UL
++#define blwmFeatureMask 0x00040000UL
++#define abvmFeatureMask 0x00020000UL
++#define distFeatureMask 0x00010000UL
++#define initFeatureMask 0x00008000UL
++#define cjctFeatureMask 0x00004000UL
++#define rkrfFeatureMask 0x00002000UL
++#define caltFeatureMask 0x00001000UL
++#define kernFeatureMask 0x00000800UL
+
+-class ReorderingOutput : public UMemory {
++// Syllable structure bits
++#define baseConsonantMask 0x00000400UL
++#define consonantMask 0x00000200UL
++#define halfConsonantMask 0x00000100UL
++#define rephConsonantMask 0x00000080UL
++#define matraMask 0x00000040UL
++#define vowelModifierMask 0x00000020UL
++#define markPositionMask 0x00000018UL
++
++#define postBasePosition 0x00000000UL
++#define preBasePosition 0x00000008UL
++#define aboveBasePosition 0x00000010UL
++#define belowBasePosition 0x00000018UL
++
++#define repositionedGlyphMask 0x00000002UL
++
++#define basicShapingFormsMask ( loclFeatureMask | nuktFeatureMask | akhnFeatureMask | rkrfFeatureMask | blwfFeatureMask | halfFeatureMask | vatuFeatureMask | cjctFeatureMask )
++#define positioningFormsMask ( kernFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask )
++#define presentationFormsMask ( presFeatureMask | abvsFeatureMask | blwsFeatureMask | pstsFeatureMask | halnFeatureMask | caltFeatureMask )
++
++
++#define C_MALAYALAM_VOWEL_SIGN_U 0x0D41
++#define C_DOTTED_CIRCLE 0x25CC
++#define NO_GLYPH 0xFFFF
++
++// Some level of debate as to the proper value for MAX_CONSONANTS_PER_SYLLABLE. Ticket 5588 states that 4
++// is the magic number according to ISCII, but 5 seems to be the more consistent with XP.
++#define MAX_CONSONANTS_PER_SYLLABLE 5
++
++#define INDIC_BLOCK_SIZE 0x7F
++
++class IndicReorderingOutput : public UMemory {
+ private:
++ le_int32 fSyllableCount;
+ le_int32 fOutIndex;
+ LEUnicode *fOutChars;
+
+@@ -95,8 +136,8 @@
+ LEUnicode fLengthMark;
+ le_int32 fLengthMarkIndex;
+
+- LEUnicode fVirama;
+- le_int32 fViramaIndex;
++ LEUnicode fAlLakuna;
++ le_int32 fAlLakunaIndex;
+
+ FeatureMask fMatraFeatures;
+
+@@ -113,15 +154,20 @@
+ le_int32 fSMIndex;
+ FeatureMask fSMFeatures;
+
++ LEUnicode fPreBaseConsonant;
++ LEUnicode fPreBaseVirama;
++ le_int32 fPBCIndex;
++ FeatureMask fPBCFeatures;
++
+ void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass)
+ {
+ // FIXME: check if already set, or if not a matra...
+ if (IndicClassTable::isLengthMark(matraClass)) {
+ fLengthMark = matra;
+ fLengthMarkIndex = matraIndex;
+- } else if (IndicClassTable::isVirama(matraClass)) {
+- fVirama = matra;
+- fViramaIndex = matraIndex;
++ } else if (IndicClassTable::isAlLakuna(matraClass)) {
++ fAlLakuna = matra;
++ fAlLakunaIndex = matraIndex;
+ } else {
+ switch (matraClass & CF_POS_MASK) {
+ case CF_POS_BEFORE:
+@@ -152,29 +198,34 @@
+ }
+
+ public:
+- ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups)
+- : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage),
++ IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups)
++ : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage),
+ fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0),
+- fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fVirama(0), fViramaIndex(0),
++ fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fAlLakuna(0), fAlLakunaIndex(0),
+ fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
+ fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0),
+- fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0)
++ fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0),
++ fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0)
+ {
+ // nothing else to do...
+ }
+
+- ~ReorderingOutput()
++ ~IndicReorderingOutput()
+ {
+ // nothing to do here...
+ }
+
+ void reset()
+ {
+- fMpre = fMbelow = fMabove = fMpost = fLengthMark = fVirama = 0;
++ fSyllableCount += 1;
++
++ fMpre = fMbelow = fMabove = fMpost = fLengthMark = fAlLakuna = 0;
+ fMPreOutIndex = -1;
+
+ fVMabove = fVMpost = 0;
+ fSMabove = fSMbelow = 0;
++
++ fPreBaseConsonant = fPreBaseVirama = 0;
+ }
+
+ void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures)
+@@ -184,11 +235,113 @@
+ fOutChars[fOutIndex] = ch;
+
+ fGlyphStorage.setCharIndex(fOutIndex, charIndex, success);
+- fGlyphStorage.setAuxData(fOutIndex, charFeatures, success);
++ fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success);
+
+ fOutIndex += 1;
+ }
+
++ void setFeatures ( le_uint32 charIndex, FeatureMask charFeatures)
++ {
++ LEErrorCode success = LE_NO_ERROR;
++
++ fGlyphStorage.setAuxData( charIndex, charFeatures, success );
++
++ }
++
++ FeatureMask getFeatures ( le_uint32 charIndex )
++ {
++ LEErrorCode success = LE_NO_ERROR;
++ return fGlyphStorage.getAuxData(charIndex,success);
++ }
++
++ void decomposeReorderMatras ( const IndicClassTable *classTable, le_int32 beginSyllable, le_int32 nextSyllable, le_int32 inv_count ) {
++ le_int32 i;
++ LEErrorCode success = LE_NO_ERROR;
++
++ for ( i = beginSyllable ; i < nextSyllable ; i++ ) {
++ if ( classTable->isMatra(fOutChars[i+inv_count])) {
++ IndicClassTable::CharClass matraClass = classTable->getCharClass(fOutChars[i+inv_count]);
++ if ( classTable->isSplitMatra(matraClass)) {
++ le_int32 saveIndex = fGlyphStorage.getCharIndex(i+inv_count,success);
++ le_uint32 saveAuxData = fGlyphStorage.getAuxData(i+inv_count,success);
++ const SplitMatra *splitMatra = classTable->getSplitMatra(matraClass);
++ int j;
++ for (j = 0 ; *(splitMatra)[j] != 0 ; j++) {
++ LEUnicode piece = (*splitMatra)[j];
++ if ( j == 0 ) {
++ fOutChars[i+inv_count] = piece;
++ matraClass = classTable->getCharClass(piece);
++ } else {
++ insertCharacter(piece,i+1+inv_count,saveIndex,saveAuxData);
++ nextSyllable++;
++ }
++ }
++ }
++
++ if ((matraClass & CF_POS_MASK) == CF_POS_BEFORE) {
++ moveCharacter(i+inv_count,beginSyllable+inv_count);
++ }
++ }
++ }
++ }
++
++ void moveCharacter( le_int32 fromPosition, le_int32 toPosition ) {
++ le_int32 i,saveIndex;
++ le_uint32 saveAuxData;
++ LEUnicode saveChar = fOutChars[fromPosition];
++ LEErrorCode success = LE_NO_ERROR;
++ LEErrorCode success2 = LE_NO_ERROR;
++ saveIndex = fGlyphStorage.getCharIndex(fromPosition,success);
++ saveAuxData = fGlyphStorage.getAuxData(fromPosition,success);
++
++ if ( fromPosition > toPosition ) {
++ for ( i = fromPosition ; i > toPosition ; i-- ) {
++ fOutChars[i] = fOutChars[i-1];
++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success2),success);
++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success2), success);
++
++ }
++ } else {
++ for ( i = fromPosition ; i < toPosition ; i++ ) {
++ fOutChars[i] = fOutChars[i+1];
++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success2),success);
++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success2), success);
++ }
++
++ }
++ fOutChars[toPosition] = saveChar;
++ fGlyphStorage.setCharIndex(toPosition,saveIndex,success);
++ fGlyphStorage.setAuxData(toPosition,saveAuxData,success);
++
++ }
++ void insertCharacter( LEUnicode ch, le_int32 toPosition, le_int32 charIndex, le_uint32 auxData ) {
++ LEErrorCode success = LE_NO_ERROR;
++ le_int32 i;
++ fOutIndex += 1;
++
++ for ( i = fOutIndex ; i > toPosition ; i--) {
++ fOutChars[i] = fOutChars[i-1];
++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success),success);
++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success), success);
++ }
++
++ fOutChars[toPosition] = ch;
++ fGlyphStorage.setCharIndex(toPosition,charIndex,success);
++ fGlyphStorage.setAuxData(toPosition,auxData,success);
++
++ }
++ void removeCharacter( le_int32 fromPosition ) {
++ LEErrorCode success = LE_NO_ERROR;
++ le_int32 i;
++ fOutIndex -= 1;
++
++ for ( i = fromPosition ; i < fOutIndex ; i--) {
++ fOutChars[i] = fOutChars[i+1];
++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success),success);
++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success), success);
++ }
++ }
++
+ le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, FeatureMask matraFeatures, le_bool wordStart)
+ {
+ IndicClassTable::CharClass matraClass = classTable->getCharClass(matra);
+@@ -268,6 +421,14 @@
+ }
+ }
+
++ void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features)
++ {
++ fPBCIndex = index;
++ fPreBaseConsonant = PBConsonant;
++ fPreBaseVirama = PBVirama;
++ fPBCFeatures = features;
++ }
++
+ void noteBaseConsonant()
+ {
+ if (fMPreFixups != NULL && fMPreOutIndex >= 0) {
+@@ -275,11 +436,11 @@
+ }
+ }
+
+- // Handles virama in Sinhala split vowels.
+- void writeVirama()
++ // Handles Al-Lakuna in Sinhala split vowels.
++ void writeAlLakuna()
+ {
+- if (fVirama != 0) {
+- writeChar(fVirama, fViramaIndex, fMatraFeatures);
++ if (fAlLakuna != 0) {
++ writeChar(fAlLakuna, fAlLakunaIndex, fMatraFeatures);
+ }
+ }
+
+@@ -347,26 +508,39 @@
+ }
+ }
+
++ void writePreBaseConsonant()
++ {
++ // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam. However,
++ // it seems that almost none of the fonts for Malayalam are set up to handle this.
++ // So, we're going to force the issue here by using the rakar as defined with RA in most fonts.
++
++ if (fPreBaseConsonant == 0x0d31) { // RRA
++ fPreBaseConsonant = 0x0d30; // RA
++ }
++
++ if (fPreBaseConsonant != 0) {
++ writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures);
++ writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures);
++ }
++ }
++
+ le_int32 getOutputIndex()
+ {
+ return fOutIndex;
+ }
+ };
+
+-enum
+-{
+- C_DOTTED_CIRCLE = 0x25CC
+-};
++
+
+ // TODO: Find better names for these!
+-#define tagArray4 (nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask)
++#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask)
+ #define tagArray3 (pstfFeatureMask | tagArray4)
+ #define tagArray2 (halfFeatureMask | tagArray3)
+ #define tagArray1 (blwfFeatureMask | tagArray2)
+ #define tagArray0 (rphfFeatureMask | tagArray1)
+
+-static const FeatureMap featureMap[] =
+-{
++static const FeatureMap featureMap[] = {
++ {loclFeatureTag, loclFeatureMask},
+ {initFeatureTag, initFeatureMask},
+ {nuktFeatureTag, nuktFeatureMask},
+ {akhnFeatureTag, akhnFeatureMask},
+@@ -387,21 +561,47 @@
+
+ static const le_int32 featureCount = LE_ARRAY_SIZE(featureMap);
+
++static const FeatureMap v2FeatureMap[] = {
++ {loclFeatureTag, loclFeatureMask},
++ {nuktFeatureTag, nuktFeatureMask},
++ {akhnFeatureTag, akhnFeatureMask},
++ {rphfFeatureTag, rphfFeatureMask},
++ {rkrfFeatureTag, rkrfFeatureMask},
++ {blwfFeatureTag, blwfFeatureMask},
++ {halfFeatureTag, halfFeatureMask},
++ {vatuFeatureTag, vatuFeatureMask},
++ {cjctFeatureTag, cjctFeatureMask},
++ {presFeatureTag, presFeatureMask},
++ {abvsFeatureTag, abvsFeatureMask},
++ {blwsFeatureTag, blwsFeatureMask},
++ {pstsFeatureTag, pstsFeatureMask},
++ {halnFeatureTag, halnFeatureMask},
++ {caltFeatureTag, caltFeatureMask},
++ {kernFeatureTag, kernFeatureMask},
++ {distFeatureTag, distFeatureMask},
++ {abvmFeatureTag, abvmFeatureMask},
++ {blwmFeatureTag, blwmFeatureMask}
++};
++
++static const le_int32 v2FeatureMapCount = LE_ARRAY_SIZE(v2FeatureMap);
++
+ static const le_int8 stateTable[][CC_COUNT] =
+ {
+-// xx vm sm iv i2 i3 ct cn nu dv s1 s2 s3 vr zw
+- { 1, 1, 1, 5, 8, 11, 3, 2, 1, 5, 9, 5, 1, 1, 1}, // 0 - ground state
+- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state
+- {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1}, // 2 - consonant with nukta
+- {-1, 6, 1, -1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, -1}, // 3 - consonant
+- {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7}, // 4 - consonant virama
+- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels
+- {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark
+- {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1}, // 7 - ZWJ, ZWNJ
+- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1}, // 8 - independent vowels that can take a virama
+- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1}, // 9 - first part of split vowel
+- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1}, // 10 - second part of split vowel
+- {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1} // 11 - independent vowels that can take an iv
++// xx vm sm iv i2 i3 ct cn nu dv s1 s2 s3 vr zw al
++ { 1, 6, 1, 5, 8, 11, 3, 2, 1, 5, 9, 5, 5, 1, 1, 1}, // 0 - ground state
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state
++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, 12, -1}, // 2 - consonant with nukta
++ {-1, 6, 1, -1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, 12, 13}, // 3 - consonant
++ {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7, -1}, // 4 - consonant virama
++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels
++ {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark
++ {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1}, // 7 - consonant virama ZWJ, consonant ZWJ virama
++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1}, // 8 - independent vowels that can take a virama
++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1, -1}, // 9 - first part of split vowel
++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1}, // 10 - second part of split vowel
++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1, -1}, // 11 - independent vowels that can take an iv
++ {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, 7}, // 12 - consonant ZWJ (TODO: Take everything else that can be after a consonant?)
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1} // 13 - consonant al-lakuna ZWJ consonant
+ };
+
+
+@@ -412,14 +612,29 @@
+ return featureMap;
+ }
+
++const FeatureMap *IndicReordering::getv2FeatureMap(le_int32 &count)
++{
++ count = v2FeatureMapCount;
++
++ return v2FeatureMap;
++}
++
+ le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount)
+ {
+ le_int32 cursor = prev;
+ le_int8 state = 0;
++ le_int8 consonant_count = 0;
+
+ while (cursor < charCount) {
+ IndicClassTable::CharClass charClass = classTable->getCharClass(chars[cursor]);
+
++ if ( IndicClassTable::isConsonant(charClass) ) {
++ consonant_count++;
++ if ( consonant_count > MAX_CONSONANTS_PER_SYLLABLE ) {
++ break;
++ }
++ }
++
+ state = stateTable[state][charClass & CF_CLASS_MASK];
+
+ if (state < 0) {
+@@ -434,16 +649,24 @@
+
+ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode,
+ LEUnicode *outChars, LEGlyphStorage &glyphStorage,
+- MPreFixups **outMPreFixups)
++ MPreFixups **outMPreFixups, LEErrorCode& success)
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ MPreFixups *mpreFixups = NULL;
+ const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode);
+
+ if (classTable->scriptFlags & SF_MPRE_FIXUP) {
+ mpreFixups = new MPreFixups(charCount);
++ if (mpreFixups == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
+ }
+
+- ReorderingOutput output(outChars, glyphStorage, mpreFixups);
++ IndicReorderingOutput output(outChars, glyphStorage, mpreFixups);
+ le_int32 i, prev = 0;
+ le_bool lastInWord = FALSE;
+
+@@ -458,7 +681,7 @@
+ output.noteStressMark(classTable, chars[markStart], markStart, tagArray1);
+ }
+
+- if (classTable->isVowelModifier(chars[markStart - 1])) {
++ if (markStart != prev && classTable->isVowelModifier(chars[markStart - 1])) {
+ markStart -= 1;
+ output.noteVowelModifier(classTable, chars[markStart], markStart, tagArray1);
+ }
+@@ -484,9 +707,20 @@
+
+ break;
+
++ case CC_AL_LAKUNA:
+ case CC_NUKTA:
++ output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1);
++ output.writeChar(chars[prev], prev, tagArray1);
++ break;
++
+ case CC_VIRAMA:
++ // A lone virama is illegal unless it follows a
++ // MALAYALAM_VOWEL_SIGN_U. Such a usage is called
++ // "samvruthokaram".
++ if (chars[prev - 1] != C_MALAYALAM_VOWEL_SIGN_U) {
+ output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1);
++ }
++
+ output.writeChar(chars[prev], prev, tagArray1);
+ break;
+
+@@ -518,7 +752,7 @@
+ }
+
+ output.writeLengthMark();
+- output.writeVirama();
++ output.writeAlLakuna();
+
+ if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {
+ output.writeVMabove();
+@@ -538,7 +772,7 @@
+ le_int32 baseLimit = prev;
+
+ // Check for REPH at front of syllable
+- if (length > 2 && classTable->isReph(chars[prev]) && classTable->isVirama(chars[prev + 1])) {
++ if (length > 2 && classTable->isReph(chars[prev]) && classTable->isVirama(chars[prev + 1]) && chars[prev + 2] != C_SIGN_ZWNJ) {
+ baseLimit += 2;
+
+ // Check for eyelash RA, if the script supports it
+@@ -556,35 +790,59 @@
+ lastConsonant -= 1;
+ }
+
++
++ IndicClassTable::CharClass charClass = CC_RESERVED;
++ IndicClassTable::CharClass nextClass = CC_RESERVED;
+ le_int32 baseConsonant = lastConsonant;
+ le_int32 postBase = lastConsonant + 1;
+ le_int32 postBaseLimit = classTable->scriptFlags & SF_POST_BASE_LIMIT_MASK;
+ le_bool seenVattu = FALSE;
+ le_bool seenBelowBaseForm = FALSE;
++ le_bool seenPreBaseForm = FALSE;
++ le_bool hasNukta = FALSE;
++ le_bool hasBelowBaseForm = FALSE;
++ le_bool hasPostBaseForm = FALSE;
++ le_bool hasPreBaseForm = FALSE;
+
+ if (postBase < markStart && classTable->isNukta(chars[postBase])) {
++ charClass = CC_NUKTA;
+ postBase += 1;
+ }
+
+ while (baseConsonant > baseLimit) {
+- IndicClassTable::CharClass charClass = classTable->getCharClass(chars[baseConsonant]);
++ nextClass = charClass;
++ hasNukta = IndicClassTable::isNukta(nextClass);
++ charClass = classTable->getCharClass(chars[baseConsonant]);
++
++ hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta;
++ hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta;
++ hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta;
+
+ if (IndicClassTable::isConsonant(charClass)) {
+ if (postBaseLimit == 0 || seenVattu ||
+ (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) ||
+- !IndicClassTable::hasPostOrBelowBaseForm(charClass)) {
++ !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) {
+ break;
+ }
+
+- seenVattu = IndicClassTable::isVattu(charClass);
++ // Note any pre-base consonants
++ if ( baseConsonant == lastConsonant && lastConsonant > 0 &&
++ hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) {
++ output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2);
++ seenPreBaseForm = TRUE;
+
+- if (IndicClassTable::hasPostBaseForm(charClass)) {
++ }
++ // consonants with nuktas are never vattus
++ seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta;
++
++ // consonants with nuktas never have below- or post-base forms
++ if (hasPostBaseForm) {
+ if (seenBelowBaseForm) {
+ break;
+ }
+
+ postBase = baseConsonant;
+- } else if (IndicClassTable::hasBelowBaseForm(charClass)) {
++ } else if (hasBelowBaseForm) {
+ seenBelowBaseForm = TRUE;
+ }
+
+@@ -606,20 +864,25 @@
+ }
+
+ // write any pre-base consonants
++ output.writePreBaseConsonant();
++
+ le_bool supressVattu = TRUE;
+
+ for (i = baseLimit; i < baseConsonant; i += 1) {
+ LEUnicode ch = chars[i];
+- // Don't put 'blwf' on first consonant.
+- FeatureMask features = (i == baseLimit? tagArray2 : tagArray1);
+- IndicClassTable::CharClass charClass = classTable->getCharClass(ch);
++ // Don't put 'pstf' or 'blwf' on anything before the base consonant.
++ FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask );
++
++ charClass = classTable->getCharClass(ch);
++ nextClass = classTable->getCharClass(chars[i + 1]);
++ hasNukta = IndicClassTable::isNukta(nextClass);
+
+ if (IndicClassTable::isConsonant(charClass)) {
+- if (IndicClassTable::isVattu(charClass) && supressVattu) {
++ if (IndicClassTable::isVattu(charClass) && !hasNukta && supressVattu) {
+ features = tagArray4;
+ }
+
+- supressVattu = IndicClassTable::isVattu(charClass);
++ supressVattu = IndicClassTable::isVattu(charClass) && !hasNukta;
+ } else if (IndicClassTable::isVirama(charClass) && chars[i + 1] == C_SIGN_ZWNJ)
+ {
+ features = tagArray4;
+@@ -634,7 +897,8 @@
+ bcSpan += 1;
+ }
+
+- if (baseConsonant == lastConsonant && bcSpan < markStart && classTable->isVirama(chars[bcSpan])) {
++ if (baseConsonant == lastConsonant && bcSpan < markStart &&
++ (classTable->isVirama(chars[bcSpan]) || classTable->isAlLakuna(chars[bcSpan]))) {
+ bcSpan += 1;
+
+ if (bcSpan < markStart && chars[bcSpan] == C_SIGN_ZWNJ) {
+@@ -658,7 +922,7 @@
+ }
+
+ // write below-base consonants
+- if (baseConsonant != lastConsonant) {
++ if (baseConsonant != lastConsonant && !seenPreBaseForm) {
+ for (i = bcSpan + 1; i < postBase; i += 1) {
+ output.writeChar(chars[i], i, tagArray1);
+ }
+@@ -688,7 +952,7 @@
+
+ // write post-base consonants
+ // FIXME: does this put the right tags on post-base consonants?
+- if (baseConsonant != lastConsonant) {
++ if (baseConsonant != lastConsonant && !seenPreBaseForm) {
+ if (postBase <= lastConsonant) {
+ for (i = postBase; i <= lastConsonant; i += 1) {
+ output.writeChar(chars[i], i, tagArray3);
+@@ -710,7 +974,7 @@
+ }
+
+ output.writeLengthMark();
+- output.writeVirama();
++ output.writeAlLakuna();
+
+ // write reph
+ if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {
+@@ -740,13 +1004,250 @@
+ return output.getOutputIndex();
+ }
+
+-void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage)
++void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success)
+ {
+ if (mpreFixups != NULL) {
+- mpreFixups->apply(glyphStorage);
++ mpreFixups->apply(glyphStorage, success);
+
+ delete mpreFixups;
+ }
+ }
+
++void IndicReordering::applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count)
++{
++ LEErrorCode success = LE_NO_ERROR;
++
++// This sets us up for 2nd pass of glyph substitution as well as setting the feature masks for the
++// GPOS table lookups
++
++ for ( le_int32 i = 0 ; i < count ; i++ ) {
++ glyphStorage.setAuxData(i, ( presentationFormsMask | positioningFormsMask ), success);
++ }
++
++}
++void IndicReordering::finalReordering(LEGlyphStorage &glyphStorage, le_int32 count)
++{
++ LEErrorCode success = LE_NO_ERROR;
++
++ // Reposition REPH as appropriate
++
++ for ( le_int32 i = 0 ; i < count ; i++ ) {
++
++ le_int32 tmpAuxData = glyphStorage.getAuxData(i,success);
++ LEGlyphID tmpGlyph = glyphStorage.getGlyphID(i,success);
++
++ if ( ( tmpGlyph != NO_GLYPH ) && (tmpAuxData & rephConsonantMask) && !(tmpAuxData & repositionedGlyphMask)) {
++
++ le_bool targetPositionFound = false;
++ le_int32 targetPosition = i+1;
++ le_int32 baseConsonantData;
++
++ while (!targetPositionFound) {
++ tmpGlyph = glyphStorage.getGlyphID(targetPosition,success);
++ tmpAuxData = glyphStorage.getAuxData(targetPosition,success);
++
++ if ( tmpAuxData & baseConsonantMask ) {
++ baseConsonantData = tmpAuxData;
++ targetPositionFound = true;
++ } else {
++ targetPosition++;
++ }
++ }
++
++ // Make sure we are not putting the reph into an empty hole
++
++ le_bool targetPositionHasGlyph = false;
++ while (!targetPositionHasGlyph) {
++ tmpGlyph = glyphStorage.getGlyphID(targetPosition,success);
++ if ( tmpGlyph != NO_GLYPH ) {
++ targetPositionHasGlyph = true;
++ } else {
++ targetPosition--;
++ }
++ }
++
++ // Make sure that REPH is positioned after any above base or post base matras
++ //
++ le_bool checkMatraDone = false;
++ le_int32 checkMatraPosition = targetPosition+1;
++ while ( !checkMatraDone ) {
++ tmpAuxData = glyphStorage.getAuxData(checkMatraPosition,success);
++ if ( checkMatraPosition >= count || ( (tmpAuxData ^ baseConsonantData) & LE_GLYPH_GROUP_MASK)) {
++ checkMatraDone = true;
++ continue;
++ }
++ if ( (tmpAuxData & matraMask) &&
++ (((tmpAuxData & markPositionMask) == aboveBasePosition) ||
++ ((tmpAuxData & markPositionMask) == postBasePosition))) {
++ targetPosition = checkMatraPosition;
++ }
++ checkMatraPosition++;
++ }
++
++ glyphStorage.moveGlyph(i,targetPosition,repositionedGlyphMask);
++ }
++ }
++}
++
++
++le_int32 IndicReordering::v2process(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage)
++{
++ const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode);
++
++ DynamicProperties dynProps[INDIC_BLOCK_SIZE];
++ IndicReordering::getDynamicProperties(dynProps,classTable);
++
++ IndicReorderingOutput output(outChars, glyphStorage, NULL);
++ le_int32 i, firstConsonant, baseConsonant, secondConsonant, inv_count = 0, beginSyllable = 0;
++ //le_bool lastInWord = FALSE;
++
++ while (beginSyllable < charCount) {
++ le_int32 nextSyllable = findSyllable(classTable, chars, beginSyllable, charCount);
++
++ output.reset();
++
++ // Find the First Consonant
++ for ( firstConsonant = beginSyllable ; firstConsonant < nextSyllable ; firstConsonant++ ) {
++ if ( classTable->isConsonant(chars[firstConsonant]) ) {
++ break;
++ }
++ }
++
++ // Find the base consonant
++
++ baseConsonant = nextSyllable - 1;
++ secondConsonant = firstConsonant;
++
++ // TODO: Use Dynamic Properties for hasBelowBaseForm and hasPostBaseForm()
++
++ while ( baseConsonant > firstConsonant ) {
++ if ( classTable->isConsonant(chars[baseConsonant]) &&
++ !classTable->hasBelowBaseForm(chars[baseConsonant]) &&
++ !classTable->hasPostBaseForm(chars[baseConsonant]) ) {
++ break;
++ }
++ else {
++ if ( classTable->isConsonant(chars[baseConsonant]) ) {
++ secondConsonant = baseConsonant;
++ }
++ baseConsonant--;
++ }
++ }
++
++ // If the syllable starts with Ra + Halant ( in a script that has Reph ) and has more than one
++ // consonant, Ra is excluced from candidates for base consonants
++
++ if ( classTable->isReph(chars[beginSyllable]) &&
++ beginSyllable+1 < nextSyllable && classTable->isVirama(chars[beginSyllable+1]) &&
++ secondConsonant != firstConsonant) {
++ baseConsonant = secondConsonant;
++ }
++
++ // Populate the output
++ for ( i = beginSyllable ; i < nextSyllable ; i++ ) {
++
++ // Handle invalid combinartions
++
++ if ( classTable->isVirama(chars[beginSyllable]) ||
++ classTable->isMatra(chars[beginSyllable]) ||
++ classTable->isVowelModifier(chars[beginSyllable]) ||
++ classTable->isNukta(chars[beginSyllable]) ) {
++ output.writeChar(C_DOTTED_CIRCLE,beginSyllable,basicShapingFormsMask);
++ inv_count++;
++ }
++ output.writeChar(chars[i],i, basicShapingFormsMask);
++
++ }
++
++ // Adjust features and set syllable structure bits
++
++ for ( i = beginSyllable ; i < nextSyllable ; i++ ) {
++
++ FeatureMask outMask = output.getFeatures(i+inv_count);
++ FeatureMask saveMask = outMask;
++
++ // Since reph can only validly occur at the beginning of a syllable
++ // We only apply it to the first 2 characters in the syllable, to keep it from
++ // conflicting with other features ( i.e. rkrf )
++
++ // TODO : Use the dynamic property for determining isREPH
++ if ( i == beginSyllable && i < baseConsonant && classTable->isReph(chars[i]) &&
++ i+1 < nextSyllable && classTable->isVirama(chars[i+1])) {
++ outMask |= rphfFeatureMask;
++ outMask |= rephConsonantMask;
++ output.setFeatures(i+1+inv_count,outMask);
++
++ }
++
++ if ( i == baseConsonant ) {
++ outMask |= baseConsonantMask;
++ }
++
++ if ( classTable->isMatra(chars[i])) {
++ outMask |= matraMask;
++ if ( classTable->hasAboveBaseForm(chars[i])) {
++ outMask |= aboveBasePosition;
++ } else if ( classTable->hasBelowBaseForm(chars[i])) {
++ outMask |= belowBasePosition;
++ }
++ }
++
++ // Don't apply half form to virama that stands alone at the end of a syllable
++ // to prevent half forms from forming when syllable ends with virama
++
++ if ( classTable->isVirama(chars[i]) && (i+1 == nextSyllable) ) {
++ outMask ^= halfFeatureMask;
++ if ( classTable->isConsonant(chars[i-1]) ) {
++ FeatureMask tmp = output.getFeatures(i-1+inv_count);
++ tmp ^= halfFeatureMask;
++ output.setFeatures(i-1+inv_count,tmp);
++ }
++ }
++
++ if ( outMask != saveMask ) {
++ output.setFeatures(i+inv_count,outMask);
++ }
++ }
++
++ output.decomposeReorderMatras(classTable,beginSyllable,nextSyllable,inv_count);
++
++ beginSyllable = nextSyllable;
++ }
++
++
++ return output.getOutputIndex();
++}
++
++
++void IndicReordering::getDynamicProperties( DynamicProperties *, const IndicClassTable *classTable ) {
++
++
++ LEUnicode currentChar;
++ LEUnicode virama;
++ LEUnicode workChars[2];
++ LEGlyphStorage workGlyphs;
++
++ IndicReorderingOutput workOutput(workChars, workGlyphs, NULL);
++
++ //le_int32 offset = 0;
++
++ // First find the relevant virama for the script we are dealing with
++
++ for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) {
++ if ( classTable->isVirama(currentChar)) {
++ virama = currentChar;
++ break;
++ }
++ }
++
++ for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) {
++ if ( classTable->isConsonant(currentChar)) {
++ workOutput.reset();
++ }
++ }
++
++
++}
++
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/IndicReordering.h b/src/share/native/sun/font/layout/IndicReordering.h
+--- jdk/src/share/native/sun/font/layout/IndicReordering.h
++++ jdk/src/share/native/sun/font/layout/IndicReordering.h
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved
+ *
+ */
+
+@@ -62,7 +62,8 @@
+ #define CC_SPLIT_VOWEL_PIECE_3 12U
+ #define CC_VIRAMA 13U
+ #define CC_ZERO_WIDTH_MARK 14U
+-#define CC_COUNT 15U
++#define CC_AL_LAKUNA 15U
++#define CC_COUNT 16U
+
+ // Character class flags
+ #define CF_CLASS_MASK 0x0000FFFFU
+@@ -74,6 +75,7 @@
+ #define CF_BELOW_BASE 0x10000000U
+ #define CF_POST_BASE 0x08000000U
+ #define CF_LENGTH_MARK 0x04000000U
++#define CF_PRE_BASE 0x02000000U
+
+ #define CF_POS_BEFORE 0x00300000U
+ #define CF_POS_BELOW 0x00200000U
+@@ -89,6 +91,7 @@
+ #define SF_REPH_AFTER_BELOW 0x40000000U
+ #define SF_EYELASH_RA 0x20000000U
+ #define SF_MPRE_FIXUP 0x10000000U
++#define SF_FILTER_ZERO_WIDTH 0x08000000U
+
+ #define SF_POST_BASE_LIMIT_MASK 0x0000FFFFU
+ #define SF_NO_POST_BASE_LIMIT 0x00007FFFU
+@@ -98,6 +101,15 @@
+ class MPreFixups;
+ class LEGlyphStorage;
+
++// Dynamic Properties ( v2 fonts only )
++typedef le_uint32 DynamicProperties;
++
++#define DP_REPH 0x80000000U
++#define DP_HALF 0x40000000U
++#define DP_PREF 0x20000000U
++#define DP_BLWF 0x10000000U
++#define DP_PSTF 0x08000000U
++
+ struct IndicClassTable
+ {
+ typedef le_uint32 CharClass;
+@@ -111,6 +123,7 @@
+ const SplitMatra *splitMatraTable;
+
+ inline le_int32 getWorstCaseExpansion() const;
++ inline le_bool getFilterZeroWidth() const;
+
+ CharClass getCharClass(LEUnicode ch) const;
+
+@@ -121,6 +134,7 @@
+ inline le_bool isConsonant(LEUnicode ch) const;
+ inline le_bool isReph(LEUnicode ch) const;
+ inline le_bool isVirama(LEUnicode ch) const;
++ inline le_bool isAlLakuna(LEUnicode ch) const;
+ inline le_bool isNukta(LEUnicode ch) const;
+ inline le_bool isVattu(LEUnicode ch) const;
+ inline le_bool isMatra(LEUnicode ch) const;
+@@ -129,12 +143,15 @@
+ inline le_bool hasPostOrBelowBaseForm(LEUnicode ch) const;
+ inline le_bool hasPostBaseForm(LEUnicode ch) const;
+ inline le_bool hasBelowBaseForm(LEUnicode ch) const;
++ inline le_bool hasAboveBaseForm(LEUnicode ch) const;
++ inline le_bool hasPreBaseForm(LEUnicode ch) const;
+
+ inline static le_bool isVowelModifier(CharClass charClass);
+ inline static le_bool isStressMark(CharClass charClass);
+ inline static le_bool isConsonant(CharClass charClass);
+ inline static le_bool isReph(CharClass charClass);
+ inline static le_bool isVirama(CharClass charClass);
++ inline static le_bool isAlLakuna(CharClass charClass);
+ inline static le_bool isNukta(CharClass charClass);
+ inline static le_bool isVattu(CharClass charClass);
+ inline static le_bool isMatra(CharClass charClass);
+@@ -143,6 +160,8 @@
+ inline static le_bool hasPostOrBelowBaseForm(CharClass charClass);
+ inline static le_bool hasPostBaseForm(CharClass charClass);
+ inline static le_bool hasBelowBaseForm(CharClass charClass);
++ inline static le_bool hasAboveBaseForm(CharClass charClass);
++ inline static le_bool hasPreBaseForm(CharClass charClass);
+
+ static const IndicClassTable *getScriptClassTable(le_int32 scriptCode);
+ };
+@@ -151,14 +170,27 @@
+ public:
+ static le_int32 getWorstCaseExpansion(le_int32 scriptCode);
+
++ static le_bool getFilterZeroWidth(le_int32 scriptCode);
++
+ static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode,
+ LEUnicode *outChars, LEGlyphStorage &glyphStorage,
+- MPreFixups **outMPreFixups);
++ MPreFixups **outMPreFixups, LEErrorCode& success);
+
+- static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage);
++ static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success);
++
++ static le_int32 v2process(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage);
+
+ static const FeatureMap *getFeatureMap(le_int32 &count);
+
++ static const FeatureMap *getv2FeatureMap(le_int32 &count);
++
++ static void applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count);
++
++ static void finalReordering(LEGlyphStorage &glyphStorage, le_int32 count);
++
++ static void getDynamicProperties(DynamicProperties *dProps, const IndicClassTable *classTable);
++
+ private:
+ // do not instantiate
+ IndicReordering();
+@@ -172,6 +204,11 @@
+ return worstCaseExpansion;
+ }
+
++inline le_bool IndicClassTable::getFilterZeroWidth() const
++{
++ return (scriptFlags & SF_FILTER_ZERO_WIDTH) != 0;
++}
++
+ inline const SplitMatra *IndicClassTable::getSplitMatra(CharClass charClass) const
+ {
+ le_int32 index = (charClass & CF_INDEX_MASK) >> CF_INDEX_SHIFT;
+@@ -209,6 +246,11 @@
+ return (charClass & CF_CLASS_MASK) == CC_VIRAMA;
+ }
+
++inline le_bool IndicClassTable::isAlLakuna(CharClass charClass)
++{
++ return (charClass & CF_CLASS_MASK) == CC_AL_LAKUNA;
++}
++
+ inline le_bool IndicClassTable::isVattu(CharClass charClass)
+ {
+ return (charClass & CF_VATTU) != 0;
+@@ -241,11 +283,21 @@
+ return (charClass & CF_POST_BASE) != 0;
+ }
+
++inline le_bool IndicClassTable::hasPreBaseForm(CharClass charClass)
++{
++ return (charClass & CF_PRE_BASE) != 0;
++}
++
+ inline le_bool IndicClassTable::hasBelowBaseForm(CharClass charClass)
+ {
+ return (charClass & CF_BELOW_BASE) != 0;
+ }
+
++inline le_bool IndicClassTable::hasAboveBaseForm(CharClass charClass)
++{
++ return ((charClass & CF_POS_MASK) == CF_POS_ABOVE);
++}
++
+ inline le_bool IndicClassTable::isVowelModifier(LEUnicode ch) const
+ {
+ return isVowelModifier(getCharClass(ch));
+@@ -271,6 +323,11 @@
+ return isVirama(getCharClass(ch));
+ }
+
++inline le_bool IndicClassTable::isAlLakuna(LEUnicode ch) const
++{
++ return isAlLakuna(getCharClass(ch));
++}
++
+ inline le_bool IndicClassTable::isNukta(LEUnicode ch) const
+ {
+ return isNukta(getCharClass(ch));
+@@ -311,5 +368,14 @@
+ return hasBelowBaseForm(getCharClass(ch));
+ }
+
++inline le_bool IndicClassTable::hasPreBaseForm(LEUnicode ch) const
++{
++ return hasPreBaseForm(getCharClass(ch));
++}
++
++inline le_bool IndicClassTable::hasAboveBaseForm(LEUnicode ch) const
++{
++ return hasAboveBaseForm(getCharClass(ch));
++}
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp
+--- jdk/src/share/native/sun/font/layout/KernTable.cpp
++++ jdk/src/share/native/sun/font/layout/KernTable.cpp
+@@ -26,7 +26,7 @@
+ /*
+ *
+ *
+- * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 2004-2010 - All Rights Reserved
+ *
+ */
+
+@@ -35,6 +35,7 @@
+ #include "LEGlyphStorage.h"
+
+ #include "LESwaps.h"
++#include "OpenTypeUtilities.h"
+
+ #include <stdio.h>
+
+@@ -91,8 +92,8 @@
+ * TODO: support multiple subtables
+ * TODO: respect header flags
+ */
+-KernTable::KernTable(const LEFontInstance* font, const void* tableData)
+- : pairs(0), font(font)
++KernTable::KernTable(const LEFontInstance* font_, const void* tableData)
++ : pairs(0), font(font_)
+ {
+ const KernTableHeader* header = (const KernTableHeader*)tableData;
+ if (header == 0) {
+@@ -120,10 +121,18 @@
+ coverage = SWAPW(subhead->coverage);
+ if (coverage & COVERAGE_HORIZONTAL) { // only handle horizontal kerning
+ const Subtable_0* table = (const Subtable_0*)((char*)subhead + KERN_SUBTABLE_HEADER_SIZE);
+- nPairs = SWAPW(table->nPairs);
+- searchRange = SWAPW(table->searchRange) / KERN_PAIRINFO_SIZE ;
++
++ nPairs = SWAPW(table->nPairs);
++
++#if 0 // some old fonts have bad values here...
++ searchRange = SWAPW(table->searchRange);
+ entrySelector = SWAPW(table->entrySelector);
+- rangeShift = SWAPW(table->rangeShift) / KERN_PAIRINFO_SIZE;
++ rangeShift = SWAPW(table->rangeShift);
++#else
++ entrySelector = OpenTypeUtilities::highBit(nPairs);
++ searchRange = (1 << entrySelector) * KERN_PAIRINFO_SIZE;
++ rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange;
++#endif
+
+ pairs = (PairInfo*)font->getKernPairs();
+ if (pairs == NULL) {
+diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp b/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
+@@ -25,7 +25,7 @@
+
+
+ /*
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
+ *
+ * This file is a modification of the ICU file IndicLayoutEngine.cpp
+ * by Jens Herden and Javier Sola for Khmer language
+@@ -43,16 +43,16 @@
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine)
+
+ KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+ }
+
+ KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags)
+- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
++ le_int32 typoFlags, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success)
+ {
+ fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.h b/src/share/native/sun/font/layout/KhmerLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
+ *
+ * This file is a modification of the ICU file IndicLayoutEngine.h
+ * by Jens Herden and Javier Sola for Khmer language
+@@ -72,8 +72,9 @@
+ *
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+- * @param languageCode - the language
++ * @param langaugeCode - the language
+ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LayoutEngine::layoutEngineFactory
+ * @see OpenTypeLayoutEngine
+@@ -82,7 +83,7 @@
+ * @internal
+ */
+ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -91,6 +92,7 @@
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
++ * @param success - set to an error code if the operation fails
+ *
+ * @see OpenTypeLayoutEngine
+ * @see ScriptAndLangaugeTags.h for script and language codes
+@@ -98,7 +100,7 @@
+ * @internal
+ */
+ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags);
++ le_int32 typoFlags, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+diff --git a/src/share/native/sun/font/layout/KhmerReordering.cpp b/src/share/native/sun/font/layout/KhmerReordering.cpp
+--- jdk/src/share/native/sun/font/layout/KhmerReordering.cpp
++++ jdk/src/share/native/sun/font/layout/KhmerReordering.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
+ *
+ * This file is a modification of the ICU file IndicReordering.cpp
+ * by Jens Herden and Javier Sola for Khmer language
+@@ -149,8 +149,9 @@
+
+
+
+-class ReorderingOutput : public UMemory {
++class KhmerReorderingOutput : public UMemory {
+ private:
++ le_int32 fSyllableCount;
+ le_int32 fOutIndex;
+ LEUnicode *fOutChars;
+
+@@ -158,17 +159,22 @@
+
+
+ public:
+- ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage)
+- : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
++ KhmerReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage)
++ : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
+ {
+ // nothing else to do...
+ }
+
+- ~ReorderingOutput()
++ ~KhmerReorderingOutput()
+ {
+ // nothing to do here...
+ }
+
++ void reset()
++ {
++ fSyllableCount += 1;
++ }
++
+ void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures)
+ {
+ LEErrorCode success = LE_NO_ERROR;
+@@ -176,7 +182,7 @@
+ fOutChars[fOutIndex] = ch;
+
+ fGlyphStorage.setCharIndex(fOutIndex, charIndex, success);
+- fGlyphStorage.setAuxData(fOutIndex, charFeatures, success);
++ fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success);
+
+ fOutIndex += 1;
+ }
+@@ -328,12 +334,12 @@
+ {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 9 - First consonant or type 3 after ceong
+ {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, // 10 - Second Coeng (no register shifter before)
+ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant (or ind. vowel) no register shifter before
+- {-1, -1, 1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter
++ {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter
+ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 13 - Second register shifter
+ {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 14 - ZWJ before vowel
+ {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 15 - ZWNJ before vowel
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, // 16 - dependent vowel
+- {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, // 17 - sign above
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, // 17 - sign above
+ {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, // 18 - ZWJ after vowel
+ {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, // 19 - Third coeng
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, // 20 - dependent vowel after a Robat
+@@ -380,7 +386,7 @@
+ {
+ const KhmerClassTable *classTable = KhmerClassTable::getKhmerClassTable();
+
+- ReorderingOutput output(outChars, glyphStorage);
++ KhmerReorderingOutput output(outChars, glyphStorage);
+ KhmerClassTable::CharClass charClass;
+ le_int32 i, prev = 0, coengRo;
+
+@@ -390,6 +396,8 @@
+ while (prev < charCount) {
+ le_int32 syllable = findSyllable(classTable, chars, prev, charCount);
+
++ output.reset();
++
+ // write a pre vowel or the pre part of a split vowel first
+ // and look out for coeng + ro. RO is the only vowel of type 2, and
+ // therefore the only one that requires saving space before the base.
+diff --git a/src/share/native/sun/font/layout/LEFontInstance.cpp b/src/share/native/sun/font/layout/LEFontInstance.cpp
+--- jdk/src/share/native/sun/font/layout/LEFontInstance.cpp
++++ jdk/src/share/native/sun/font/layout/LEFontInstance.cpp
+@@ -26,7 +26,7 @@
+ /*
+ *******************************************************************************
+ *
+- * Copyright (C) 1999-2005, International Business Machines
++ * Copyright (C) 1999-2007, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ *
+ *******************************************************************************
+@@ -45,6 +45,16 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance)
+
++LECharMapper::~LECharMapper()
++{
++ // nothing to do.
++}
++
++LEFontInstance::~LEFontInstance()
++{
++ // nothing to do
++}
++
+ const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit,
+ le_int32 script, LEErrorCode &success) const
+ {
+@@ -62,7 +72,7 @@
+ }
+
+ void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count,
+- le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const
++ le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const
+ {
+ le_int32 i, out = 0, dir = 1;
+
+@@ -83,7 +93,7 @@
+ }
+ }
+
+- glyphStorage[out] = mapCharToGlyph(code, mapper);
++ glyphStorage[out] = mapCharToGlyph(code, mapper, filterZeroWidth);
+
+ if (code >= 0x10000) {
+ i += 1;
+@@ -94,14 +104,71 @@
+
+ LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const
+ {
++ return mapCharToGlyph(ch, mapper, TRUE);
++}
++
++LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const
++{
+ LEUnicode32 mappedChar = mapper->mapChar(ch);
+
+- if (mappedChar == 0xFFFE || mappedChar == 0xFFFF ||
+- mappedChar == 0x200C || mappedChar == 0x200D) {
++ if (mappedChar == 0xFFFE || mappedChar == 0xFFFF) {
+ return 0xFFFF;
+ }
+
++ if (filterZeroWidth && (mappedChar == 0x200C || mappedChar == 0x200D)) {
++ return canDisplay(mappedChar)? 0x0001 : 0xFFFF;
++ }
++
+ return mapCharToGlyph(mappedChar);
+ }
++
++le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const
++{
++ return LE_GET_GLYPH(mapCharToGlyph(ch)) != 0;
++}
++
++float LEFontInstance::xUnitsToPoints(float xUnits) const
++{
++ return (xUnits * getXPixelsPerEm()) / (float) getUnitsPerEM();
++}
++
++float LEFontInstance::yUnitsToPoints(float yUnits) const
++{
++ return (yUnits * getYPixelsPerEm()) / (float) getUnitsPerEM();
++}
++
++void LEFontInstance::unitsToPoints(LEPoint &units, LEPoint &points) const
++{
++ points.fX = xUnitsToPoints(units.fX);
++ points.fY = yUnitsToPoints(units.fY);
++}
++
++float LEFontInstance::xPixelsToUnits(float xPixels) const
++{
++ return (xPixels * getUnitsPerEM()) / (float) getXPixelsPerEm();
++}
++
++float LEFontInstance::yPixelsToUnits(float yPixels) const
++{
++ return (yPixels * getUnitsPerEM()) / (float) getYPixelsPerEm();
++}
++
++void LEFontInstance::pixelsToUnits(LEPoint &pixels, LEPoint &units) const
++{
++ units.fX = xPixelsToUnits(pixels.fX);
++ units.fY = yPixelsToUnits(pixels.fY);
++}
++
++void LEFontInstance::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const
++{
++ pixels.fX = xUnitsToPoints(xFunits) * getScaleFactorX();
++ pixels.fY = yUnitsToPoints(yFunits) * getScaleFactorY();
++}
++
++le_int32 LEFontInstance::getLineHeight() const
++{
++ return getAscent() + getDescent() + getLeading();
++}
++
+ U_NAMESPACE_END
+
+diff --git a/src/share/native/sun/font/layout/LEFontInstance.h b/src/share/native/sun/font/layout/LEFontInstance.h
+--- jdk/src/share/native/sun/font/layout/LEFontInstance.h
++++ jdk/src/share/native/sun/font/layout/LEFontInstance.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
+ *
+ */
+
+@@ -57,7 +57,7 @@
+ * Destructor.
+ * @stable ICU 3.2
+ */
+- virtual inline ~LECharMapper() {};
++ virtual ~LECharMapper();
+
+ /**
+ * This method does the adjustments.
+@@ -75,7 +75,7 @@
+ * This is a forward reference to the class which holds the per-glyph
+ * storage.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ class LEGlyphStorage;
+
+@@ -101,7 +101,7 @@
+ * methods with some default behavior such as returning constant values, or using the
+ * values from the first subfont.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ class U_LAYOUT_API LEFontInstance : public UObject
+ {
+@@ -113,7 +113,7 @@
+ *
+ * @stable ICU 2.8
+ */
+- virtual inline ~LEFontInstance() {};
++ virtual ~LEFontInstance();
+
+ /**
+ * Get a physical font which can render the given text. For composite fonts,
+@@ -209,7 +209,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline le_bool canDisplay(LEUnicode32 ch) const;
++ virtual le_bool canDisplay(LEUnicode32 ch) const;
+
+ /**
+ * This method returns the number of design units in
+@@ -237,13 +237,31 @@
+ * @param count - the number of characters
+ * @param reverse - if <code>TRUE</code>, store the glyph indices in reverse order.
+ * @param mapper - the character mapper.
++ * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours.
+ * @param glyphStorage - the object which contains the output glyph array
+ *
+ * @see LECharMapper
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.6
+ */
+- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const;
++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const;
++
++ /**
++ * This method maps a single character to a glyph index, using the
++ * font's character to glyph map. The default implementation of this
++ * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>.
++ *
++ * @param ch - the character
++ * @param mapper - the character mapper
++ * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours.
++ *
++ * @return the glyph index
++ *
++ * @see LECharMapper
++ *
++ * @stable ICU 3.6
++ */
++ virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const;
+
+ /**
+ * This method maps a single character to a glyph index, using the
+@@ -335,7 +353,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline float xUnitsToPoints(float xUnits) const;
++ virtual float xUnitsToPoints(float xUnits) const;
+
+ /**
+ * This method converts font design units in the
+@@ -347,7 +365,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline float yUnitsToPoints(float yUnits) const;
++ virtual float yUnitsToPoints(float yUnits) const;
+
+ /**
+ * This method converts font design units to points.
+@@ -357,7 +375,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline void unitsToPoints(LEPoint &units, LEPoint &points) const;
++ virtual void unitsToPoints(LEPoint &units, LEPoint &points) const;
+
+ /**
+ * This method converts pixels in the
+@@ -369,7 +387,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline float xPixelsToUnits(float xPixels) const;
++ virtual float xPixelsToUnits(float xPixels) const;
+
+ /**
+ * This method converts pixels in the
+@@ -381,7 +399,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline float yPixelsToUnits(float yPixels) const;
++ virtual float yPixelsToUnits(float yPixels) const;
+
+ /**
+ * This method converts pixels to font design units.
+@@ -391,7 +409,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline void pixelsToUnits(LEPoint &pixels, LEPoint &units) const;
++ virtual void pixelsToUnits(LEPoint &pixels, LEPoint &units) const;
+
+ /**
+ * Get the X scale factor from the font's transform. The default
+@@ -433,7 +451,7 @@
+ *
+ * @stable ICU 3.2
+ */
+- virtual inline void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const;
++ virtual void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const;
+
+ /**
+ * This is a convenience method used to convert
+@@ -523,49 +541,6 @@
+
+ };
+
+-inline le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const
+-{
+- return LE_GET_GLYPH(mapCharToGlyph(ch)) != 0;
+-}
+-
+-inline float LEFontInstance::xUnitsToPoints(float xUnits) const
+-{
+- return (xUnits * getXPixelsPerEm()) / (float) getUnitsPerEM();
+-}
+-
+-inline float LEFontInstance::yUnitsToPoints(float yUnits) const
+-{
+- return (yUnits * getYPixelsPerEm()) / (float) getUnitsPerEM();
+-}
+-
+-inline void LEFontInstance::unitsToPoints(LEPoint &units, LEPoint &points) const
+-{
+- points.fX = xUnitsToPoints(units.fX);
+- points.fY = yUnitsToPoints(units.fY);
+-}
+-
+-inline float LEFontInstance::xPixelsToUnits(float xPixels) const
+-{
+- return (xPixels * getUnitsPerEM()) / (float) getXPixelsPerEm();
+-}
+-
+-inline float LEFontInstance::yPixelsToUnits(float yPixels) const
+-{
+- return (yPixels * getUnitsPerEM()) / (float) getYPixelsPerEm();
+-}
+-
+-inline void LEFontInstance::pixelsToUnits(LEPoint &pixels, LEPoint &units) const
+-{
+- units.fX = xPixelsToUnits(pixels.fX);
+- units.fY = yPixelsToUnits(pixels.fY);
+-}
+-
+-inline void LEFontInstance::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const
+-{
+- pixels.fX = xUnitsToPoints(xFunits) * getScaleFactorX();
+- pixels.fY = yUnitsToPoints(yFunits) * getScaleFactorY();
+-}
+-
+ inline float LEFontInstance::fixedToFloat(le_int32 fixed)
+ {
+ return (float) (fixed / 65536.0);
+@@ -576,11 +551,6 @@
+ return (le_int32) (theFloat * 65536.0);
+ }
+
+-inline le_int32 LEFontInstance::getLineHeight() const
+-{
+- return getAscent() + getDescent() + getLeading();
+-}
+-
+ U_NAMESPACE_END
+ #endif
+
+diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.cpp b/src/share/native/sun/font/layout/LEGlyphStorage.cpp
+--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp
++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ **********************************************************************
+- * Copyright (C) 1998-2005, International Business Machines
++ * Copyright (C) 1998-2009, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ **********************************************************************
+ */
+@@ -38,6 +38,11 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage)
+
++LEInsertionCallback::~LEInsertionCallback()
++{
++ // nothing to do...
++}
++
+ LEGlyphStorage::LEGlyphStorage()
+ : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL),
+ fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0)
+@@ -129,8 +134,18 @@
+ if (fInsertionList == NULL) {
+ // FIXME: check this for failure?
+ fInsertionList = new LEInsertionList(rightToLeft);
++ if (fInsertionList == NULL) {
++ LE_DELETE_ARRAY(fCharIndices);
++ fCharIndices = NULL;
++
++ LE_DELETE_ARRAY(fGlyphs);
++ fGlyphs = NULL;
++
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return;
+ }
+ }
++}
+
+ // FIXME: do we want to initialize the positions to [0, 0]?
+ le_int32 LEGlyphStorage::allocatePositions(LEErrorCode &success)
+@@ -139,6 +154,11 @@
+ return -1;
+ }
+
++ if (fPositions != NULL) {
++ success = LE_INTERNAL_ERROR;
++ return -1;
++ }
++
+ fPositions = LE_NEW_ARRAY(float, 2 * (fGlyphCount + 1));
+
+ if (fPositions == NULL) {
+@@ -156,6 +176,11 @@
+ return -1;
+ }
+
++ if (fAuxData != NULL) {
++ success = LE_INTERNAL_ERROR;
++ return -1;
++ }
++
+ fAuxData = LE_NEW_ARRAY(le_uint32, fGlyphCount);
+
+ if (fAuxData == NULL) {
+@@ -510,10 +535,49 @@
+ fGlyphCount = newGlyphCount;
+ }
+
+-// FIXME: add error checking?
++// Move a glyph to a different position in the LEGlyphStorage ( used for Indic v2 processing )
++
++void LEGlyphStorage::moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker )
++{
++
++ LEErrorCode success = LE_NO_ERROR;
++
++ LEGlyphID holdGlyph = getGlyphID(fromPosition,success);
++ le_int32 holdCharIndex = getCharIndex(fromPosition,success);
++ le_uint32 holdAuxData = getAuxData(fromPosition,success);
++
++ if ( fromPosition < toPosition ) {
++ for ( le_int32 i = fromPosition ; i < toPosition ; i++ ) {
++ setGlyphID(i,getGlyphID(i+1,success),success);
++ setCharIndex(i,getCharIndex(i+1,success),success);
++ setAuxData(i,getAuxData(i+1,success),success);
++ }
++ } else {
++ for ( le_int32 i = toPosition ; i > fromPosition ; i-- ) {
++ setGlyphID(i,getGlyphID(i-1,success),success);
++ setCharIndex(i,getCharIndex(i-1,success),success);
++ setAuxData(i,getAuxData(i-1,success),success);
++
++ }
++ }
++
++ setGlyphID(toPosition,holdGlyph,success);
++ setCharIndex(toPosition,holdCharIndex,success);
++ setAuxData(toPosition,holdAuxData | marker,success);
++
++}
++
++// Glue code for existing stable API
+ LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount)
+ {
+- return fInsertionList->insert(atIndex, insertCount);
++ LEErrorCode ignored = LE_NO_LAYOUT_ERROR;
++ return insertGlyphs(atIndex, insertCount, ignored);
++}
++
++// FIXME: add error checking?
++LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success)
++{
++ return fInsertionList->insert(atIndex, insertCount, success);
+ }
+
+ le_int32 LEGlyphStorage::applyInsertions()
+@@ -526,11 +590,27 @@
+
+ le_int32 newGlyphCount = fGlyphCount + growAmount;
+
+- fGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount);
+- fCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount);
++ LEGlyphID *newGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount);
++ if (newGlyphs == NULL) {
++ // Could not grow the glyph array
++ return fGlyphCount;
++ }
++ fGlyphs = newGlyphs;
++
++ le_int32 *newCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount);
++ if (newCharIndices == NULL) {
++ // Could not grow the glyph array
++ return fGlyphCount;
++ }
++ fCharIndices = newCharIndices;
+
+ if (fAuxData != NULL) {
+- fAuxData = (le_uint32 *) LE_GROW_ARRAY(fAuxData, newGlyphCount);
++ le_uint32 *newAuxData = (le_uint32 *) LE_GROW_ARRAY(fAuxData, newGlyphCount);
++ if (newAuxData == NULL) {
++ // could not grow the aux data array
++ return fGlyphCount;
++ }
++ fAuxData = (le_uint32 *)newAuxData;
+ }
+
+ fSrcIndex = fGlyphCount - 1;
+diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.h b/src/share/native/sun/font/layout/LEGlyphStorage.h
+--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.h
++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.h
+@@ -25,7 +25,7 @@
+
+ /*
+ **********************************************************************
+- * Copyright (C) 1998-2005, International Business Machines
++ * Copyright (C) 1998-2010, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ **********************************************************************
+ */
+@@ -54,7 +54,7 @@
+ *
+ * @see LEInsertionList.h
+ *
+- * @draft ICU 3.6
++ * @stable ICU 3.6
+ */
+ class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback
+ {
+@@ -130,7 +130,7 @@
+ *
+ * @see LEInsertionList.h
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]);
+
+@@ -141,14 +141,14 @@
+ * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code>
+ * to allocate the data.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ LEGlyphStorage();
+
+ /**
+ * The destructor. This will deallocate all of the arrays.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ ~LEGlyphStorage();
+
+@@ -157,7 +157,7 @@
+ *
+ * @return the number of glyphs in the glyph array
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ inline le_int32 getGlyphCount() const;
+
+@@ -169,7 +169,7 @@
+ * @param glyphs - the destiniation glyph array
+ * @param success - set to an error code if the operation fails
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const;
+
+@@ -183,7 +183,7 @@
+ * @param extraBits - this value will be ORed with each glyph index
+ * @param success - set to an error code if the operation fails
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const;
+
+@@ -195,7 +195,7 @@
+ * @param charIndices - the destiniation character index array
+ * @param success - set to an error code if the operation fails
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const;
+
+@@ -208,7 +208,7 @@
+ * @param indexBase - an offset which will be added to each index
+ * @param success - set to an error code if the operation fails
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const;
+
+@@ -221,7 +221,7 @@
+ * @param positions - the destiniation position array
+ * @param success - set to an error code if the operation fails
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void getGlyphPositions(float positions[], LEErrorCode &success) const;
+
+@@ -237,7 +237,7 @@
+ * @param y - the glyph's Y position
+ * @param success - set to an error code if the operation fails
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const;
+
+@@ -251,7 +251,7 @@
+ * @param success set to an error code if the storage cannot be allocated of if the initial
+ * glyph count is not positive.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success);
+
+@@ -263,7 +263,7 @@
+ *
+ * @return the number of X, Y position pairs allocated.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ le_int32 allocatePositions(LEErrorCode &success);
+
+@@ -274,7 +274,7 @@
+ *
+ * @return the size of the auxillary data array.
+ *
+- * @draft ICU 3.6
++ * @stable ICU 3.6
+ */
+ le_int32 allocateAuxData(LEErrorCode &success);
+
+@@ -284,7 +284,7 @@
+ * @param auxData the auxillary data array will be copied to this address
+ * @param success set to an error code if the data cannot be copied
+ *
+- * @draft ICU 3.6
++ * @stable ICU 3.6
+ */
+ void getAuxData(le_uint32 auxData[], LEErrorCode &success) const;
+
+@@ -296,7 +296,7 @@
+ *
+ * @return the glyph ID
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ LEGlyphID getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const;
+
+@@ -308,7 +308,7 @@
+ *
+ * @return the character index
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ le_int32 getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const;
+
+@@ -321,7 +321,7 @@
+ *
+ * @return the auxillary data
+ *
+- * @draft ICU 3.6
++ * @stable ICU 3.6
+ */
+ le_uint32 getAuxData(le_int32 glyphIndex, LEErrorCode &success) const;
+
+@@ -333,7 +333,7 @@
+ *
+ * @return a reference to the given location in the glyph array
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ inline LEGlyphID &operator[](le_int32 glyphIndex) const;
+
+@@ -346,16 +346,52 @@
+ *
+ * @param atIndex the index of the glyph to be replaced
+ * @param insertCount the number of glyphs to replace it with
++ * @param success set to an error code if the auxillary data cannot be retrieved.
+ *
+ * @return the address at which to store the replacement glyphs.
+ *
+- * @see LEInsetionList.h
++ * @see LEInsertionList.h
+ *
+- * @draft ICU 3.0
++ * @stable ICU 4.2
++ */
++ LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success);
++
++ /**
++ * Call this method to replace a single glyph in the glyph array
++ * with multiple glyphs. This method uses the <code>LEInsertionList</code>
++ * to do the insertion. It returns the address of storage where the new
++ * glyph IDs can be stored. They will not actually be inserted into the
++ * glyph array until <code>applyInsertions</code> is called.
++ *
++ * Note: Don't use this version, use the other version of this function which has an error code.
++ *
++ * @param atIndex the index of the glyph to be replaced
++ * @param insertCount the number of glyphs to replace it with
++ *
++ * @return the address at which to store the replacement glyphs.
++ *
++ * @see LEInsertionList.h
++ *
++ * @stable ICU 3.0
+ */
+ LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount);
+
+ /**
++ * This method is used to reposition glyphs during Indic v2 processing. It moves
++ * all of the relevant glyph information ( glyph, indices, positions, and auxData ),
++ * from the source position to the target position, and also allows for a marker bit
++ * to be set in the target glyph's auxData so that it won't be reprocessed later in the
++ * cycle.
++ *
++ * @param fromPosition - position of the glyph to be moved
++ * @param toPosition - target position of the glyph
++ * @param marker marker bit
++ *
++ * @stable ICU 4.2
++ */
++ void moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker);
++
++ /**
+ * This method causes all of the glyph insertions recorded by
+ * <code>insertGlyphs</code> to be applied to the glyph array. The
+ * new slots in the char indices and the auxillary data arrays
+@@ -365,7 +401,7 @@
+ *
+ * @see LEInsertionList.h
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ le_int32 applyInsertions();
+
+@@ -376,7 +412,7 @@
+ * @param glyphID the new glyph ID
+ * @param success will be set to an error code if the glyph ID cannot be set.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success);
+
+@@ -387,7 +423,7 @@
+ * @param charIndex the new char index
+ * @param success will be set to an error code if the char index cannot be set.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success);
+
+@@ -399,7 +435,7 @@
+ * @param y the new Y position
+ * @param success will be set to an error code if the position cannot be set.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success);
+
+@@ -411,7 +447,7 @@
+ * @param yAdjust the adjustment to the glyph's Y position
+ * @param success will be set to an error code if the glyph's position cannot be adjusted.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success);
+
+@@ -422,7 +458,7 @@
+ * @param auxData the new auxillary data
+ * @param success will be set to an error code if the auxillary data cannot be set.
+ *
+- * @draft ICU 3.6
++ * @stable ICU 3.6
+ */
+ void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success);
+
+@@ -434,7 +470,7 @@
+ * @param from the <code>LEGlyphStorage</code> object from which
+ * to get the new glyph array.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adoptGlyphArray(LEGlyphStorage &from);
+
+@@ -446,7 +482,7 @@
+ * @param from the <code>LEGlyphStorage</code> object from which
+ * to get the new char indices array.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adoptCharIndicesArray(LEGlyphStorage &from);
+
+@@ -458,7 +494,7 @@
+ * @param from the <code>LEGlyphStorage</code> object from which
+ * to get the new position array.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adoptPositionArray(LEGlyphStorage &from);
+
+@@ -470,7 +506,7 @@
+ * @param from the <code>LEGlyphStorage</code> object from which
+ * to get the new auxillary data array.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adoptAuxDataArray(LEGlyphStorage &from);
+
+@@ -481,7 +517,7 @@
+ * @param from the <code>LEGlyphStorage</code> object from which
+ * to get the new glyph count.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adoptGlyphCount(LEGlyphStorage &from);
+
+@@ -490,7 +526,7 @@
+ *
+ * @param newGlyphCount the new glyph count.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void adoptGlyphCount(le_int32 newGlyphCount);
+
+@@ -500,21 +536,21 @@
+ * to layout a different characer array. (This method is also called
+ * by the destructor)
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ void reset();
+
+ /**
+ * ICU "poor man's RTTI", returns a UClassID for the actual class.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ virtual UClassID getDynamicClassID() const;
+
+ /**
+ * ICU "poor man's RTTI", returns a UClassID for this class.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 3.0
+ */
+ static UClassID getStaticClassID();
+ };
+diff --git a/src/share/native/sun/font/layout/LEInsertionList.cpp b/src/share/native/sun/font/layout/LEInsertionList.cpp
+--- jdk/src/share/native/sun/font/layout/LEInsertionList.cpp
++++ jdk/src/share/native/sun/font/layout/LEInsertionList.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ **********************************************************************
+- * Copyright (C) 1998-2004, International Business Machines
++ * Copyright (C) 1998-2008, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ **********************************************************************
+ */
+@@ -76,9 +76,17 @@
+ return growAmount;
+ }
+
+-LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count)
++LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count, LEErrorCode &success)
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ InsertionRecord *insertion = (InsertionRecord *) LE_NEW_ARRAY(char, sizeof(InsertionRecord) + (count - ANY_NUMBER) * sizeof (LEGlyphID));
++ if (insertion == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
+
+ insertion->position = position;
+ insertion->count = count;
+diff --git a/src/share/native/sun/font/layout/LEInsertionList.h b/src/share/native/sun/font/layout/LEInsertionList.h
+--- jdk/src/share/native/sun/font/layout/LEInsertionList.h
++++ jdk/src/share/native/sun/font/layout/LEInsertionList.h
+@@ -25,7 +25,7 @@
+
+ /*
+ **********************************************************************
+- * Copyright (C) 1998-2004, International Business Machines
++ * Copyright (C) 1998-2008, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ **********************************************************************
+ */
+@@ -45,7 +45,7 @@
+ *
+ * @internal
+ */
+-class LEInsertionCallback
++class U_LAYOUT_API LEInsertionCallback
+ {
+ public:
+ /**
+@@ -62,6 +62,11 @@
+ * @internal
+ */
+ virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0;
++
++ /**
++ * The destructor
++ */
++ virtual ~LEInsertionCallback();
+ };
+
+ /**
+@@ -103,13 +108,14 @@
+ * @param position the glyph at this position in the array will be
+ * replaced by the new glyphs.
+ * @param count the number of new glyphs
++ * @param success set to an error code if the auxillary data cannot be retrieved.
+ *
+ * @return the address of an array in which to store the new glyphs. This will
+ * <em>not</em> be in the glyph array.
+ *
+ * @internal
+ */
+- LEGlyphID *insert(le_int32 position, le_int32 count);
++ LEGlyphID *insert(le_int32 position, le_int32 count, LEErrorCode &success);
+
+ /**
+ * Return the number of new glyphs that have been inserted.
+diff --git a/src/share/native/sun/font/layout/LELanguages.h b/src/share/native/sun/font/layout/LELanguages.h
+--- jdk/src/share/native/sun/font/layout/LELanguages.h
++++ jdk/src/share/native/sun/font/layout/LELanguages.h
+@@ -25,12 +25,12 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
+ *
+- * Generated on: 07/19/2005 01:01:08 PM PDT
++ * Generated on: 10/26/2010 02:53:33 PM PDT
+ */
+
+ #ifndef __LELANGUAGES_H
+@@ -50,7 +50,7 @@
+ * this is just a list of languages which the LayoutEngine
+ * supports.
+ *
+- * @draft ICU 3.4
++ * @stable ICU 2.6
+ */
+
+ enum LanguageCodes {
+@@ -85,7 +85,51 @@
+ zhsLanguageCode = 28,
+ zhtLanguageCode = 29,
+
+- languageCodeCount = 30
++ /** New language codes added 03/13/2008 @stable ICU 4.0 */
++ afkLanguageCode = 30,
++ belLanguageCode = 31,
++ bgrLanguageCode = 32,
++ catLanguageCode = 33,
++ cheLanguageCode = 34,
++ copLanguageCode = 35,
++ csyLanguageCode = 36,
++ danLanguageCode = 37,
++ deuLanguageCode = 38,
++ dznLanguageCode = 39,
++ ellLanguageCode = 40,
++ engLanguageCode = 41,
++ espLanguageCode = 42,
++ etiLanguageCode = 43,
++ euqLanguageCode = 44,
++ finLanguageCode = 45,
++ fraLanguageCode = 46,
++ gaeLanguageCode = 47,
++ hauLanguageCode = 48,
++ hrvLanguageCode = 49,
++ hunLanguageCode = 50,
++ hyeLanguageCode = 51,
++ indLanguageCode = 52,
++ itaLanguageCode = 53,
++ khmLanguageCode = 54,
++ mngLanguageCode = 55,
++ mtsLanguageCode = 56,
++ nepLanguageCode = 57,
++ nldLanguageCode = 58,
++ pasLanguageCode = 59,
++ plkLanguageCode = 60,
++ ptgLanguageCode = 61,
++ romLanguageCode = 62,
++ rusLanguageCode = 63,
++ skyLanguageCode = 64,
++ slvLanguageCode = 65,
++ sqiLanguageCode = 66,
++ srbLanguageCode = 67,
++ sveLanguageCode = 68,
++ tibLanguageCode = 69,
++ trkLanguageCode = 70,
++ welLanguageCode = 71,
++
++ languageCodeCount = 72
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LEScripts.h b/src/share/native/sun/font/layout/LEScripts.h
+--- jdk/src/share/native/sun/font/layout/LEScripts.h
++++ jdk/src/share/native/sun/font/layout/LEScripts.h
+@@ -25,40 +25,43 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
++ *
++ * Generated on: 10/26/2010 02:53:33 PM PDT
+ */
+
+ #ifndef __LESCRIPTS_H
+ #define __LESCRIPTS_H
+
+ #include "LETypes.h"
++
+ /**
+ * \file
+ * \brief C++ API: Constants for Unicode script values
+ */
+
+-
+ U_NAMESPACE_BEGIN
+
+ /**
+ * Constants for Unicode script values, generated using
+ * ICU4J's <code>UScript</code> class.
+ *
+- * @draft ICU 3.0
++ * @stable ICU 2.2
+ */
+
+ enum ScriptCodes {
+ zyyyScriptCode = 0,
+- qaaiScriptCode = 1,
++ zinhScriptCode = 1,
++ qaaiScriptCode = zinhScriptCode, /* manually added alias, for API stability */
+ arabScriptCode = 2,
+ armnScriptCode = 3,
+ bengScriptCode = 4,
+ bopoScriptCode = 5,
+ cherScriptCode = 6,
+- qaacScriptCode = 7,
++ coptScriptCode = 7,
+ cyrlScriptCode = 8,
+ dsrtScriptCode = 9,
+ devaScriptCode = 10,
+@@ -91,12 +94,24 @@
+ thaaScriptCode = 37,
+ thaiScriptCode = 38,
+ tibtScriptCode = 39,
++/**
++ * @stable ICU 2.6
++ */
++
+ cansScriptCode = 40,
++/**
++ * @stable ICU 2.2
++ */
++
+ yiiiScriptCode = 41,
+ tglgScriptCode = 42,
+ hanoScriptCode = 43,
+ buhdScriptCode = 44,
+ tagbScriptCode = 45,
++/**
++ * @stable ICU 2.6
++ */
++
+ braiScriptCode = 46,
+ cprtScriptCode = 47,
+ limbScriptCode = 48,
+@@ -105,9 +120,129 @@
+ shawScriptCode = 51,
+ taleScriptCode = 52,
+ ugarScriptCode = 53,
++/**
++ * @stable ICU 3.0
++ */
++
+ hrktScriptCode = 54,
++/**
++ * @stable ICU 3.4
++ */
+
+- scriptCodeCount = 55
++ bugiScriptCode = 55,
++ glagScriptCode = 56,
++ kharScriptCode = 57,
++ syloScriptCode = 58,
++ taluScriptCode = 59,
++ tfngScriptCode = 60,
++ xpeoScriptCode = 61,
++/**
++ * @stable ICU 3.6
++ */
++
++ baliScriptCode = 62,
++ batkScriptCode = 63,
++ blisScriptCode = 64,
++ brahScriptCode = 65,
++ chamScriptCode = 66,
++ cirtScriptCode = 67,
++ cyrsScriptCode = 68,
++ egydScriptCode = 69,
++ egyhScriptCode = 70,
++ egypScriptCode = 71,
++ geokScriptCode = 72,
++ hansScriptCode = 73,
++ hantScriptCode = 74,
++ hmngScriptCode = 75,
++ hungScriptCode = 76,
++ indsScriptCode = 77,
++ javaScriptCode = 78,
++ kaliScriptCode = 79,
++ latfScriptCode = 80,
++ latgScriptCode = 81,
++ lepcScriptCode = 82,
++ linaScriptCode = 83,
++ mandScriptCode = 84,
++ mayaScriptCode = 85,
++ meroScriptCode = 86,
++ nkooScriptCode = 87,
++ orkhScriptCode = 88,
++ permScriptCode = 89,
++ phagScriptCode = 90,
++ phnxScriptCode = 91,
++ plrdScriptCode = 92,
++ roroScriptCode = 93,
++ saraScriptCode = 94,
++ syreScriptCode = 95,
++ syrjScriptCode = 96,
++ syrnScriptCode = 97,
++ tengScriptCode = 98,
++ vaiiScriptCode = 99,
++ vispScriptCode = 100,
++ xsuxScriptCode = 101,
++ zxxxScriptCode = 102,
++ zzzzScriptCode = 103,
++/**
++ * @stable ICU 3.8
++ */
++
++ cariScriptCode = 104,
++ jpanScriptCode = 105,
++ lanaScriptCode = 106,
++ lyciScriptCode = 107,
++ lydiScriptCode = 108,
++ olckScriptCode = 109,
++ rjngScriptCode = 110,
++ saurScriptCode = 111,
++ sgnwScriptCode = 112,
++ sundScriptCode = 113,
++ moonScriptCode = 114,
++ mteiScriptCode = 115,
++/**
++ * @stable ICU 4.0
++ */
++
++ armiScriptCode = 116,
++ avstScriptCode = 117,
++ cakmScriptCode = 118,
++ koreScriptCode = 119,
++ kthiScriptCode = 120,
++ maniScriptCode = 121,
++ phliScriptCode = 122,
++ phlpScriptCode = 123,
++ phlvScriptCode = 124,
++ prtiScriptCode = 125,
++ samrScriptCode = 126,
++ tavtScriptCode = 127,
++ zmthScriptCode = 128,
++ zsymScriptCode = 129,
++/**
++ * @stable ICU 4.4
++ */
++
++ bamuScriptCode = 130,
++ lisuScriptCode = 131,
++ nkgbScriptCode = 132,
++ sarbScriptCode = 133,
++/**
++ * @stable ICU 4.6
++ */
++
++ bassScriptCode = 134,
++ duplScriptCode = 135,
++ elbaScriptCode = 136,
++ granScriptCode = 137,
++ kpelScriptCode = 138,
++ lomaScriptCode = 139,
++ mendScriptCode = 140,
++ mercScriptCode = 141,
++ narbScriptCode = 142,
++ nbatScriptCode = 143,
++ palmScriptCode = 144,
++ sindScriptCode = 145,
++ waraScriptCode = 146,
++
++ scriptCodeCount = 147
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LEStandalone.h b/src/share/native/sun/font/layout/LEStandalone.h
+--- jdk/src/share/native/sun/font/layout/LEStandalone.h
++++ jdk/src/share/native/sun/font/layout/LEStandalone.h
+@@ -26,6 +26,15 @@
+ #ifndef __LESTANDALONE
+ #define __LESTANDALONE
+
++#ifndef U_COPYRIGHT_STRING
++#define U_COPYRIGHT_STRING " (C) Copyright IBM Corp and Others. 1998-2010 - All Rights Reserved"
++#endif
++
++/* ICU Version number */
++#ifndef U_ICU_VERSION
++#define U_ICU_VERSION "4.6"
++#endif
++
+ /* Definitions to make Layout Engine work away from ICU. */
+ #ifndef U_NAMESPACE_BEGIN
+ #define U_NAMESPACE_BEGIN
+diff --git a/src/share/native/sun/font/layout/LESwaps.h b/src/share/native/sun/font/layout/LESwaps.h
+--- jdk/src/share/native/sun/font/layout/LESwaps.h
++++ jdk/src/share/native/sun/font/layout/LESwaps.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h
+--- jdk/src/share/native/sun/font/layout/LETypes.h
++++ jdk/src/share/native/sun/font/layout/LETypes.h
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -500,6 +500,7 @@
+ LE_CALT_FEATURE_TAG = 0x63616C74UL, /**< 'calt' */
+ LE_CASE_FEATURE_TAG = 0x63617365UL, /**< 'case' */
+ LE_CCMP_FEATURE_TAG = 0x63636D70UL, /**< 'ccmp' */
++ LE_CJCT_FEATURE_TAG = 0x636A6374UL, /**< 'cjct' */
+ LE_CLIG_FEATURE_TAG = 0x636C6967UL, /**< 'clig' */
+ LE_CPSP_FEATURE_TAG = 0x63707370UL, /**< 'cpsp' */
+ LE_CSWH_FEATURE_TAG = 0x63737768UL, /**< 'cswh' */
+@@ -563,6 +564,7 @@
+ LE_RAND_FEATURE_TAG = 0x72616E64UL, /**< 'rand' */
+ LE_RLIG_FEATURE_TAG = 0x726C6967UL, /**< 'rlig' */
+ LE_RPHF_FEATURE_TAG = 0x72706866UL, /**< 'rphf' */
++ LE_RKRF_FEATURE_TAG = 0x726B7266UL, /**< 'rkrf' */
+ LE_RTBD_FEATURE_TAG = 0x72746264UL, /**< 'rtbd' */
+ LE_RTLA_FEATURE_TAG = 0x72746C61UL, /**< 'rtla' */
+ LE_RUBY_FEATURE_TAG = 0x72756279UL, /**< 'ruby' */
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
+@@ -39,10 +39,11 @@
+ #include "ArabicLayoutEngine.h"
+ #include "CanonShaping.h"
+ #include "HanLayoutEngine.h"
++#include "HangulLayoutEngine.h"
+ #include "IndicLayoutEngine.h"
+ #include "KhmerLayoutEngine.h"
+ #include "ThaiLayoutEngine.h"
+-//#include "TibetanLayoutEngine.h"
++#include "TibetanLayoutEngine.h"
+ #include "GXLayoutEngine.h"
+ #include "ScriptAndLanguageTags.h"
+ #include "CharSubstitutionFilter.h"
+@@ -60,6 +61,9 @@
+
+ U_NAMESPACE_BEGIN
+
++/* Leave this copyright notice here! It needs to go somewhere in this library. */
++static const char copyright[] = U_COPYRIGHT_STRING;
++
+ const LEUnicode32 DefaultCharMapper::controlChars[] = {
+ 0x0009, 0x000A, 0x000D,
+ /*0x200C, 0x200D,*/ 0x200E, 0x200F,
+@@ -97,9 +101,8 @@
+ }
+
+ if (fFilterControls) {
+- le_int32 index = OpenTypeUtilities::search((le_uint32)ch,
+- (le_uint32 *)controlChars,
+- controlCharsCount);
++ le_int32 index = OpenTypeUtilities::search((le_uint32)ch, (le_uint32 *)controlChars, controlCharsCount);
++
+ if (controlChars[index] == ch) {
+ return 0xFFFF;
+ }
+@@ -135,56 +138,7 @@
+ // nothing to do
+ }
+
+-
+-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine)
+-
+-#define ccmpFeatureTag LE_CCMP_FEATURE_TAG
+-
+-#define ccmpFeatureMask 0x80000000UL
+-
+-#define canonFeatures (ccmpFeatureMask)
+-
+-static const FeatureMap canonFeatureMap[] =
+-{
+- {ccmpFeatureTag, ccmpFeatureMask}
+-};
+-
+-static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap);
+-
+-LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode),
+- fTypoFlags(typoFlags)
+-{
+- fGlyphStorage = new LEGlyphStorage();
+-}
+-
+-le_int32 LayoutEngine::getGlyphCount() const
+-{
+- return fGlyphStorage->getGlyphCount();
+-}
+-
+-void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const
+-{
+- fGlyphStorage->getCharIndices(charIndices, indexBase, success);
+-}
+-
+-void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const
+-{
+- fGlyphStorage->getCharIndices(charIndices, success);
+-}
+-
+-// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits
+-void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const
+-{
+- fGlyphStorage->getGlyphs(glyphs, extraBits, success);
+-}
+-
+-void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const
+-{
+- fGlyphStorage->getGlyphs(glyphs, success);
+-}
+-
+-class CanonMarkFilter : public LEGlyphFilter
++class CanonMarkFilter : public UMemory, public LEGlyphFilter
+ {
+ private:
+ const GlyphClassDefinitionTable *classDefTable;
+@@ -216,6 +170,66 @@
+ return glyphClass != 0;
+ }
+
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine)
++
++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG
++
++#define ccmpFeatureMask 0x80000000UL
++
++#define canonFeatures (ccmpFeatureMask)
++
++static const FeatureMap canonFeatureMap[] =
++{
++ {ccmpFeatureTag, ccmpFeatureMask}
++};
++
++static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap);
++
++LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance,
++ le_int32 scriptCode,
++ le_int32 languageCode,
++ le_int32 typoFlags,
++ LEErrorCode &success)
++ : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode),
++ fTypoFlags(typoFlags), fFilterZeroWidth(TRUE)
++{
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
++ fGlyphStorage = new LEGlyphStorage();
++ if (fGlyphStorage == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++}
++}
++
++le_int32 LayoutEngine::getGlyphCount() const
++{
++ return fGlyphStorage->getGlyphCount();
++}
++
++void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const
++{
++ fGlyphStorage->getCharIndices(charIndices, indexBase, success);
++}
++
++void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const
++{
++ fGlyphStorage->getCharIndices(charIndices, success);
++}
++
++// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits
++void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const
++{
++ fGlyphStorage->getGlyphs(glyphs, extraBits, success);
++}
++
++void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const
++{
++ fGlyphStorage->getGlyphs(glyphs, success);
++}
++
++
+ void LayoutEngine::getGlyphPositions(float positions[], LEErrorCode &success) const
+ {
+ fGlyphStorage->getGlyphPositions(positions, success);
+@@ -245,8 +259,21 @@
+
+ if (canonGSUBTable->coversScript(scriptTag)) {
+ CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance);
++ if (substitutionFilter == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
++
+ const LEUnicode *inChars = &chars[offset];
+ LEUnicode *reordered = NULL;
++ LEGlyphStorage fakeGlyphStorage;
++
++ fakeGlyphStorage.allocateGlyphArray(count, rightToLeft, success);
++
++ if (LE_FAILURE(success)) {
++ delete substitutionFilter;
++ return 0;
++ }
+
+ // This is the cheapest way to get mark reordering only for Hebrew.
+ // We could just do the mark reordering for all scripts, but most
+@@ -255,18 +282,19 @@
+ reordered = LE_NEW_ARRAY(LEUnicode, count);
+
+ if (reordered == NULL) {
++ delete substitutionFilter;
+ success = LE_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+
+- CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, glyphStorage);
++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage);
+ inChars = reordered;
+ }
+
+- glyphStorage.allocateGlyphArray(count, rightToLeft, success);
+- glyphStorage.allocateAuxData(success);
++ fakeGlyphStorage.allocateAuxData(success);
+
+ if (LE_FAILURE(success)) {
++ delete substitutionFilter;
+ return 0;
+ }
+
+@@ -276,21 +304,41 @@
+ }
+
+ for (i = 0; i < count; i += 1, out += dir) {
+- glyphStorage[out] = (LEGlyphID) inChars[i];
+- glyphStorage.setAuxData(out, canonFeatures, success);
++ fakeGlyphStorage[out] = (LEGlyphID) inChars[i];
++ fakeGlyphStorage.setAuxData(out, canonFeatures, success);
+ }
+
+ if (reordered != NULL) {
+ LE_DELETE_ARRAY(reordered);
+ }
+
+- outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE);
++ outCharCount = canonGSUBTable->process(fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success);
++
++ if (LE_FAILURE(success)) {
++ delete substitutionFilter;
++ return 0;
++ }
+
+ out = (rightToLeft? outCharCount - 1 : 0);
+
++ /*
++ * The char indices array in fakeGlyphStorage has the correct mapping
++ * back to the original input characters. Save it in glyphStorage. The
++ * subsequent call to glyphStoratge.allocateGlyphArray will keep this
++ * array rather than allocating and initializing a new one.
++ */
++ glyphStorage.adoptCharIndicesArray(fakeGlyphStorage);
++
+ outChars = LE_NEW_ARRAY(LEUnicode, outCharCount);
++
++ if (outChars == NULL) {
++ delete substitutionFilter;
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
++
+ for (i = 0; i < outCharCount; i += 1, out += dir) {
+- outChars[out] = (LEUnicode) LE_GET_GLYPH(glyphStorage[i]);
++ outChars[out] = (LEUnicode) LE_GET_GLYPH(fakeGlyphStorage[i]);
+ }
+
+ delete substitutionFilter;
+@@ -475,7 +523,7 @@
+
+ DefaultCharMapper charMapper(TRUE, mirror);
+
+- fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, glyphStorage);
++ fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, fFilterZeroWidth, glyphStorage);
+ }
+
+ // Input: characters, font?
+@@ -495,6 +543,10 @@
+
+ le_int32 glyphCount;
+
++ if (fGlyphStorage->getGlyphCount() > 0) {
++ fGlyphStorage->reset();
++ }
++
+ glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success);
+ positionGlyphs(*fGlyphStorage, x, y, success);
+ adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success);
+@@ -526,8 +578,15 @@
+ LayoutEngine *result = NULL;
+ LETag scriptTag = 0x00000000;
+ LETag languageTag = 0x00000000;
++ LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode);
+
+- if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
++ // Right now, only invoke V2 processing for Devanagari. TODO: Allow more V2 scripts as they are
++ // properly tested.
++
++ if ( v2ScriptTag == dev2ScriptTag && gsubTable != NULL && gsubTable->coversScript( v2ScriptTag )) {
++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success);
++ }
++ else if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
+ switch (scriptCode) {
+ case bengScriptCode:
+ case devaScriptCode:
+@@ -539,11 +598,15 @@
+ case tamlScriptCode:
+ case teluScriptCode:
+ case sinhScriptCode:
+- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, FALSE, gsubTable, success);
+ break;
+
+ case arabScriptCode:
+- result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
++ break;
++
++ case hangScriptCode:
++ result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+
+ case haniScriptCode:
+@@ -555,36 +618,35 @@
+ case zhtLanguageCode:
+ case zhsLanguageCode:
+ if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) {
+- result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+ }
+
+ // note: falling through to default case.
+ default:
+- result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+ }
+
+ break;
+-#if 0
++
+ case tibtScriptCode:
+- result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+-#endif
+
+ case khmrScriptCode:
+- result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+
+ default:
+- result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+ }
+ } else {
+ const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag);
+
+ if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) {
+- result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable);
++ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable, success);
+ } else {
+ switch (scriptCode) {
+ case bengScriptCode:
+@@ -598,29 +660,38 @@
+ case teluScriptCode:
+ case sinhScriptCode:
+ {
+- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success);
+ break;
+ }
+
+ case arabScriptCode:
+ //case hebrScriptCode:
+- result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
++ result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success);
+ break;
+
+ //case hebrScriptCode:
+ // return new HebrewOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
+
+ case thaiScriptCode:
+- result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
++ result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success);
++ break;
++
++ case hangScriptCode:
++ result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success);
+ break;
+
+ default:
+- result = new LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
++ result = new LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success);
+ break;
+ }
+ }
+ }
+
++ if (result && LE_FAILURE(success)) {
++ delete result;
++ result = NULL;
++ }
++
+ if (result == NULL) {
+ success = LE_MEMORY_ALLOCATION_ERROR;
+ }
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.h b/src/share/native/sun/font/layout/LayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
+ *
+ */
+
+@@ -133,6 +133,14 @@
+ le_int32 fTypoFlags;
+
+ /**
++ * <code>TRUE</code> if <code>mapCharsToGlyphs</code> should replace ZWJ / ZWNJ with a glyph
++ * with no contours.
++ *
++ * @internal
++ */
++ le_bool fFilterZeroWidth;
++
++ /**
+ * This constructs an instance for a given font, script and language. Subclass constructors
+ * must call this constructor.
+ *
+@@ -141,13 +149,18 @@
+ * @param languageCode - the language for the text
+ * @param typoFlags - the typographic control flags for the text. Set bit 1 if kerning
+ * is desired, set bit 2 if ligature formation is desired. Others are reserved.
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LEFontInstance
+ * @see ScriptAndLanguageTags.h
+ *
+ * @internal
+ */
+- LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
++ LayoutEngine(const LEFontInstance *fontInstance,
++ le_int32 scriptCode,
++ le_int32 languageCode,
++ le_int32 typoFlags,
++ LEErrorCode &success);
+
+ /**
+ * This overrides the default no argument constructor to make it
+@@ -338,7 +351,7 @@
+
+ /**
+ * This method will invoke the layout steps in their correct order by calling
+- * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods.. It will
++ * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods. It will
+ * compute the glyph, character index and position arrays.
+ *
+ * @param chars - the input character context
+@@ -352,8 +365,12 @@
+ *
+ * @return the number of glyphs in the glyph array
+ *
+- * Note; the glyph, character index and position array can be accessed
+- * using the getter method below.
++ * Note: The glyph, character index and position array can be accessed
++ * using the getter methods below.
++ *
++ * Note: If you call this method more than once, you must call the reset()
++ * method first to free the glyph, character index and position arrays
++ * allocated by the previous call.
+ *
+ * @stable ICU 2.8
+ */
+@@ -479,7 +496,7 @@
+
+ /**
+ * Override of existing call that provides flags to control typography.
+- * @draft ICU 3.4
++ * @stable ICU 3.4
+ */
+ static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typo_flags, LEErrorCode &success);
+
+diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp b/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
+@@ -26,7 +26,7 @@
+ /*
+ *
+ *
+- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved
+ *
+ */
+
+@@ -58,10 +58,6 @@
+ TTGlyphID ligGlyph = SWAPW(ligTable->ligGlyph);
+ le_uint16 comp;
+
+- if (filter != NULL && ! filter->accept(LE_SET_GLYPH(glyph, ligGlyph))) {
+- continue;
+- }
+-
+ for (comp = 0; comp < compCount; comp += 1) {
+ if (! glyphIterator->next()) {
+ break;
+@@ -72,7 +68,7 @@
+ }
+ }
+
+- if (comp == compCount) {
++ if (comp == compCount && (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, ligGlyph)))) {
+ GlyphIterator tempIterator(*glyphIterator);
+ TTGlyphID deletedGlyph = tempIterator.ignoresMarks()? 0xFFFE : 0xFFFF;
+
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -33,7 +33,7 @@
+ #include "OpenTypeUtilities.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
+-#include "Features.h"
++#include "ICUFeatures.h"
+ #include "Lookups.h"
+ #include "ScriptAndLanguage.h"
+ #include "GlyphDefinitionTables.h"
+@@ -45,8 +45,12 @@
+ U_NAMESPACE_BEGIN
+
+ le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++ const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_uint16 lookupType = SWAPW(lookupTable->lookupType);
+ le_uint16 subtableCount = SWAPW(lookupTable->subTableCount);
+ le_int32 startPosition = glyphIterator->getCurrStreamPosition();
+@@ -55,9 +59,9 @@
+ for (le_uint16 subtable = 0; subtable < subtableCount; subtable += 1) {
+ const LookupSubtable *lookupSubtable = lookupTable->getLookupSubtable(subtable);
+
+- delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance);
++ delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success);
+
+- if (delta > 0) {
++ if (delta > 0 && LE_FAILURE(success)) {
+ return 1;
+ }
+
+@@ -69,8 +73,12 @@
+
+ le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
+- const LEFontInstance *fontInstance) const
++ const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+
+ if (lookupSelectArray == NULL) {
+@@ -96,10 +104,9 @@
+ glyphIterator.reset(lookupFlags, selectMask);
+
+ while (glyphIterator.findFeatureTag()) {
+- le_uint32 delta = 1;
+-
+- while (glyphIterator.next(delta)) {
+- delta = applyLookupTable(lookupTable, &glyphIterator, fontInstance);
++ applyLookupTable(lookupTable, &glyphIterator, fontInstance, success);
++ if (LE_FAILURE(success)) {
++ return 0;
+ }
+ }
+
+@@ -111,12 +118,16 @@
+ }
+
+ le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator,
+- const LEFontInstance *fontInstance) const
++ const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ const LookupTable *lookupTable = lookupListTable->getLookupTable(lookupTableIndex);
+ le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags);
+ GlyphIterator tempIterator(*glyphIterator, lookupFlags);
+- le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance);
++ le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success);
+
+ return delta;
+ }
+@@ -141,7 +152,8 @@
+
+ LookupProcessor::LookupProcessor(const char *baseAddress,
+ Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset,
+- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures)
++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures,
++ LEErrorCode& success)
+ : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0),
+ lookupOrderArray(NULL), lookupOrderCount(0)
+ {
+@@ -151,6 +163,10 @@
+ le_uint16 lookupListCount = 0;
+ le_uint16 requiredFeatureIndex;
+
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
+ if (scriptListOffset != 0) {
+ scriptListTable = (const ScriptListTable *) (baseAddress + scriptListOffset);
+ langSysTable = scriptListTable->findLanguage(scriptTag, languageTag);
+@@ -177,6 +193,10 @@
+ requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex);
+
+ lookupSelectArray = LE_NEW_ARRAY(FeatureMask, lookupListCount);
++ if (lookupSelectArray == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return;
++ }
+
+ for (int i = 0; i < lookupListCount; i += 1) {
+ lookupSelectArray[i] = 0;
+@@ -213,6 +233,10 @@
+ }
+
+ lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences);
++ if (lookupOrderArray == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return;
++ }
+
+ for (le_int32 f = 0; f < featureMapCount; f += 1) {
+ FeatureMap fm = featureMap[f];
+@@ -302,6 +326,8 @@
+
+ LookupProcessor::LookupProcessor()
+ {
++ lookupOrderArray = NULL;
++ lookupSelectArray = NULL;
+ }
+
+ LookupProcessor::~LookupProcessor()
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.h b/src/share/native/sun/font/layout/LookupProcessor.h
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.h
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.h
+@@ -26,7 +26,7 @@
+ /*
+ *
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
+ *
+ */
+
+@@ -59,21 +59,28 @@
+ class LookupProcessor : public UMemory {
+ public:
+ le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance) const;
++ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+- le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+- le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+ virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 subtableType,
+- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const = 0;
++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const = 0;
+
+ virtual ~LookupProcessor();
+
+ protected:
+ LookupProcessor(const char *baseAddress,
+- Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset,
+- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures);
++ Offset scriptListOffset,
++ Offset featureListOffset,
++ Offset lookupListOffset,
++ LETag scriptTag,
++ LETag languageTag,
++ const FeatureMap *featureMap,
++ le_int32 featureMapCount,
++ le_bool orderFeatures,
++ LEErrorCode& success);
+
+ LookupProcessor();
+
+diff --git a/src/share/native/sun/font/layout/MPreFixups.cpp b/src/share/native/sun/font/layout/MPreFixups.cpp
+--- jdk/src/share/native/sun/font/layout/MPreFixups.cpp
++++ jdk/src/share/native/sun/font/layout/MPreFixups.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved
+ *
+ */
+
+@@ -65,8 +65,12 @@
+ }
+ }
+
+-void MPreFixups::apply(LEGlyphStorage &glyphStorage)
++void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success)
+ {
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
+ for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {
+ le_int32 baseIndex = fFixupData[fixup].fBaseIndex;
+ le_int32 mpreIndex = fFixupData[fixup].fMPreIndex;
+@@ -90,6 +94,14 @@
+ le_int32 mpreDest = baseIndex - mpreCount;
+ LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount);
+ le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount);
++
++ if (mpreSave == NULL || indexSave == NULL) {
++ LE_DELETE_ARRAY(mpreSave);
++ LE_DELETE_ARRAY(indexSave);
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return;
++ }
++
+ le_int32 i;
+
+ for (i = 0; i < mpreCount; i += 1) {
+diff --git a/src/share/native/sun/font/layout/MPreFixups.h b/src/share/native/sun/font/layout/MPreFixups.h
+--- jdk/src/share/native/sun/font/layout/MPreFixups.h
++++ jdk/src/share/native/sun/font/layout/MPreFixups.h
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved
+ *
+ */
+
+@@ -54,7 +54,7 @@
+
+ void add(le_int32 baseIndex, le_int32 mpreIndex);
+
+- void apply(LEGlyphStorage &glyphStorage);
++ void apply(LEGlyphStorage &glyphStorage, LEErrorCode& success);
+
+ private:
+ FixupData *fFixupData;
+diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -108,11 +108,27 @@
+ glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition());
+
+ if (glyphIterator->isRightToLeft()) {
++ // FIXME: need similar patch to below; also in MarkToLigature and MarkToMark
++ // (is there a better way to approach this for all the cases?)
+ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY);
+ } else {
+ LEPoint baseAdvance;
+
+ fontInstance->getGlyphAdvance(baseGlyph, pixels);
++
++ //JK: adjustment needs to account for non-zero advance of any marks between base glyph and current mark
++ GlyphIterator gi(baseIterator, (le_uint16)0); // copy of baseIterator that won't ignore marks
++ gi.next(); // point beyond the base glyph
++ while (gi.getCurrStreamPosition() < glyphIterator->getCurrStreamPosition()) { // for all intervening glyphs (marks)...
++ LEGlyphID otherMark = gi.getCurrGlyphID();
++ LEPoint px;
++ fontInstance->getGlyphAdvance(otherMark, px); // get advance, in case it's non-zero
++ pixels.fX += px.fX; // and add that to the base glyph's advance
++ pixels.fY += px.fY;
++ gi.next();
++ }
++ // end of JK patch
++
+ fontInstance->pixelsToUnits(pixels, baseAdvance);
+
+ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY);
+diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp b/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
+ *
+ */
+
+@@ -39,8 +39,12 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
++le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const
+ {
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+
+ // If there's a filter, we only want to do the
+@@ -87,7 +91,11 @@
+ }
+ }
+
+- LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount);
++ LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount, success);
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ le_int32 insert = 0, direction = 1;
+
+ if (glyphIterator->isRightToLeft()) {
+diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.h b/src/share/native/sun/font/layout/MultipleSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
+ *
+ */
+
+@@ -56,7 +56,7 @@
+ le_uint16 sequenceCount;
+ Offset sequenceTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const;
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -35,8 +35,10 @@
+ #include "LELanguages.h"
+
+ #include "LayoutEngine.h"
++#include "CanonShaping.h"
+ #include "OpenTypeLayoutEngine.h"
+ #include "ScriptAndLanguageTags.h"
++#include "CharSubstitutionFilter.h"
+
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphDefinitionTables.h"
+@@ -47,6 +49,8 @@
+
+ #include "GDEFMarkFilter.h"
+
++#include "KernTable.h"
++
+ U_NAMESPACE_BEGIN
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine)
+@@ -57,6 +61,8 @@
+ #define kernFeatureTag LE_KERN_FEATURE_TAG
+ #define markFeatureTag LE_MARK_FEATURE_TAG
+ #define mkmkFeatureTag LE_MKMK_FEATURE_TAG
++#define loclFeatureTag LE_LOCL_FEATURE_TAG
++#define caltFeatureTag LE_CALT_FEATURE_TAG
+
+ // 'dlig' not used at the moment
+ #define dligFeatureTag 0x646C6967
+@@ -71,8 +77,10 @@
+ #define paltFeatureMask 0x08000000UL
+ #define markFeatureMask 0x04000000UL
+ #define mkmkFeatureMask 0x02000000UL
++#define loclFeatureMask 0x01000000UL
++#define caltFeatureMask 0x00800000UL
+
+-#define minimalFeatures (ccmpFeatureMask | markFeatureMask | mkmkFeatureMask)
++#define minimalFeatures (ccmpFeatureMask | markFeatureMask | mkmkFeatureMask | loclFeatureMask | caltFeatureMask)
+ #define ligaFeatures (ligaFeatureMask | cligFeatureMask | minimalFeatures)
+ #define kernFeatures (kernFeatureMask | paltFeatureMask | minimalFeatures)
+ #define kernAndLigaFeatures (ligaFeatures | kernFeatures)
+@@ -85,14 +93,16 @@
+ {kernFeatureTag, kernFeatureMask},
+ {paltFeatureTag, paltFeatureMask},
+ {markFeatureTag, markFeatureMask},
+- {mkmkFeatureTag, mkmkFeatureMask}
++ {mkmkFeatureTag, mkmkFeatureMask},
++ {loclFeatureTag, loclFeatureMask},
++ {caltFeatureTag, caltFeatureMask}
+ };
+
+ static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap);
+
+ OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable)
+- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureMask(minimalFeatures),
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures),
+ fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE),
+ fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
+ {
+@@ -102,6 +112,15 @@
+
+ applyTypoFlags();
+
++ setScriptAndLanguageTags();
++
++ fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag);
++
++// JK patch, 2008-05-30 - see Sinhala bug report and LKLUG font
++// if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) {
++ if (gposTable != NULL && gposTable->coversScript(fScriptTag)) {
++ fGPOSTable = gposTable;
++ }
+ }
+
+ void OpenTypeLayoutEngine::applyTypoFlags() {
+@@ -109,7 +128,7 @@
+ const LEFontInstance *fontInstance = fFontInstance;
+
+ // todo: switch to more flags and bitfield rather than list of feature tags?
+- switch (typoFlags) {
++ switch (typoFlags & ~0x80000000L) {
+ case 0: break; // default
+ case 1: fFeatureMask = kernFeatures; break;
+ case 2: fFeatureMask = ligaFeatures; break;
+@@ -117,6 +136,10 @@
+ default: break;
+ }
+
++ if (typoFlags & LE_CHAR_FILTER_FEATURE_FLAG) {
++ fSubstitutionFilter = new CharSubstitutionFilter(fontInstance);
++ }
++
+ }
+
+ void OpenTypeLayoutEngine::reset()
+@@ -129,8 +152,8 @@
+ }
+
+ OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags)
+- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureOrder(FALSE),
++ le_int32 typoFlags, LEErrorCode &success)
++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureOrder(FALSE),
+ fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
+ {
+ applyTypoFlags();
+@@ -151,8 +174,23 @@
+ if (scriptCode < 0 || scriptCode >= scriptCodeCount) {
+ return 0xFFFFFFFF;
+ }
++ return scriptTags[scriptCode];
++}
+
+- return scriptTags[scriptCode];
++LETag OpenTypeLayoutEngine::getV2ScriptTag(le_int32 scriptCode)
++{
++ switch (scriptCode) {
++ case bengScriptCode : return bng2ScriptTag;
++ case devaScriptCode : return dev2ScriptTag;
++ case gujrScriptCode : return gjr2ScriptTag;
++ case guruScriptCode : return gur2ScriptTag;
++ case kndaScriptCode : return knd2ScriptTag;
++ case mlymScriptCode : return mlm2ScriptTag;
++ case oryaScriptCode : return ory2ScriptTag;
++ case tamlScriptCode : return tml2ScriptTag;
++ case teluScriptCode : return tel2ScriptTag;
++ default: return nullScriptTag;
++ }
+ }
+
+ LETag OpenTypeLayoutEngine::getLangSysTag(le_int32 languageCode)
+@@ -167,6 +205,7 @@
+ void OpenTypeLayoutEngine::setScriptAndLanguageTags()
+ {
+ fScriptTag = getScriptTag(fScriptCode);
++ fScriptTagV2 = getV2ScriptTag(fScriptCode);
+ fLangSysTag = getLangSysTag(fLanguageCode);
+ }
+
+@@ -182,20 +221,39 @@
+ return 0;
+ }
+
+- le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success);
++ // This is the cheapest way to get mark reordering only for Hebrew.
++ // We could just do the mark reordering for all scripts, but most
++ // of them probably don't need it... Another option would be to
++ // add a HebrewOpenTypeLayoutEngine subclass, but the only thing it
++ // would need to do is mark reordering, so that seems like overkill.
++ if (fScriptCode == hebrScriptCode) {
++ outChars = LE_NEW_ARRAY(LEUnicode, count);
++
++ if (outChars == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
++
++ if (LE_FAILURE(success)) {
++ LE_DELETE_ARRAY(outChars);
++ return 0;
++ }
++
++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, outChars, glyphStorage);
++ }
+
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+
+- glyphStorage.allocateGlyphArray(outCharCount, rightToLeft, success);
++ glyphStorage.allocateGlyphArray(count, rightToLeft, success);
+ glyphStorage.allocateAuxData(success);
+
+- for (le_int32 i = 0; i < outCharCount; i += 1) {
++ for (le_int32 i = 0; i < count; i += 1) {
+ glyphStorage.setAuxData(i, fFeatureMask, success);
+ }
+
+- return outCharCount;
++ return count;
+ }
+
+ // Input: characters, tags
+@@ -219,13 +277,45 @@
+ }
+
+ if (fGSUBTable != NULL) {
++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) {
++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
++
++ } else {
+ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
+- fFeatureMap, fFeatureMapCount, fFeatureOrder);
++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
++ }
+ }
+
+ return count;
+ }
++// Input: characters, tags
++// Output: glyphs, char indices
++le_int32 OpenTypeLayoutEngine::glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
++{
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
+
++ if ( count < 0 || max < 0 ) {
++ success = LE_ILLEGAL_ARGUMENT_ERROR;
++ return 0;
++ }
++
++ if (fGSUBTable != NULL) {
++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) {
++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
++
++ } else {
++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
++ }
++ }
++
++ return count;
++}
+ le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+@@ -257,6 +347,10 @@
+
+ outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success);
+
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ if (outChars != NULL) {
+ fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success);
+ LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work...
+@@ -266,6 +360,10 @@
+ //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount);
+ }
+
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
+ outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success);
+
+ return outGlyphCount;
+@@ -285,8 +383,11 @@
+ }
+
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
++ if (glyphCount == 0) {
++ return;
++ }
+
+- if (glyphCount > 0 && fGPOSTable != NULL) {
++ if (fGPOSTable != NULL) {
+ GlyphPositionAdjustments *adjustments = new GlyphPositionAdjustments(glyphCount);
+ le_int32 i;
+
+@@ -309,9 +410,21 @@
+ }
+ #endif
+
+- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, fFontInstance,
++ if (fGPOSTable != NULL) {
++ if (fScriptTagV2 != nullScriptTag && fGPOSTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) {
++ fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, fGDEFTable, success, fFontInstance,
+ fFeatureMap, fFeatureMapCount, fFeatureOrder);
+
++ } else {
++ fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, success, fFontInstance,
++ fFeatureMap, fFeatureMapCount, fFeatureOrder);
++ }
++ } else if ( fTypoFlags & 0x1 ) {
++ static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
++ KernTable kt(fFontInstance, getFontTable(kernTableTag));
++ kt.process(glyphStorage);
++ }
++
+ float xAdjust = 0, yAdjust = 0;
+
+ for (i = 0; i < glyphCount; i += 1) {
+@@ -344,6 +457,21 @@
+ glyphStorage.adjustPosition(glyphCount, xAdjust, -yAdjust, success);
+
+ delete adjustments;
++ } else {
++ // if there was no GPOS table, maybe there's non-OpenType kerning we can use
++ LayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success);
++ }
++
++ LEGlyphID zwnj = fFontInstance->mapCharToGlyph(0x200C);
++
++ if (zwnj != 0x0000) {
++ for (le_int32 g = 0; g < glyphCount; g += 1) {
++ LEGlyphID glyph = glyphStorage[g];
++
++ if (glyph == zwnj) {
++ glyphStorage[g] = LE_SET_GLYPH(glyph, 0xFFFF);
++ }
++ }
+ }
+
+ #if 0
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+@@ -24,7 +24,7 @@
+ */
+
+ /*
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -67,7 +67,7 @@
+ *
+ * @internal
+ */
+-class OpenTypeLayoutEngine : public LayoutEngine
++class U_LAYOUT_API OpenTypeLayoutEngine : public LayoutEngine
+ {
+ public:
+ /**
+@@ -80,6 +80,7 @@
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
+ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LayoutEngine::layoutEngineFactory
+ * @see ScriptAndLangaugeTags.h for script and language codes
+@@ -87,7 +88,7 @@
+ * @internal
+ */
+ OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable);
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -96,11 +97,12 @@
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+ * @param langaugeCode - the language
++ * @param success - set to an error code if the operation fails
+ *
+ * @internal
+ */
+ OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags);
++ le_int32 typoFlags, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -112,6 +114,8 @@
+ /**
+ * A convenience method used to convert the script code into
+ * the four byte script tag required by OpenType.
++ * For Indic languages where multiple script tags exist,
++ * the version 1 (old style) tag is returned.
+ *
+ * @param scriptCode - the script code
+ *
+@@ -120,6 +124,19 @@
+ * @internal
+ */
+ static LETag getScriptTag(le_int32 scriptCode);
++ /**
++ * A convenience method used to convert the script code into
++ * the four byte script tag required by OpenType.
++ * For Indic languages where multiple script tags exist,
++ * the version 2 tag is returned.
++ *
++ * @param scriptCode - the script code
++ *
++ * @return the four byte script tag
++ *
++ * @internal
++ */
++ static LETag getV2ScriptTag(le_int32 scriptCode);
+
+ /**
+ * A convenience method used to convert the langauge code into
+@@ -147,6 +164,13 @@
+ */
+ static UClassID getStaticClassID();
+
++ /**
++ * The array of language tags, indexed by language code.
++ *
++ * @internal
++ */
++ static const LETag languageTags[];
++
+ private:
+
+ /**
+@@ -161,11 +185,6 @@
+ static const LETag scriptTags[];
+
+ /**
+- * The array of language tags, indexed by language code.
+- */
+- static const LETag languageTags[];
+-
+- /**
+ * apply the typoflags. Only called by the c'tors.
+ */
+ void applyTypoFlags();
+@@ -243,6 +262,13 @@
+ LETag fScriptTag;
+
+ /**
++ * The four byte script tag for V2 fonts.
++ *
++ * @internal
++ */
++ LETag fScriptTagV2;
++
++ /**
+ * The four byte language tag
+ *
+ * @internal
+@@ -309,6 +335,8 @@
+ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
++ virtual le_int32 glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++
+ /**
+ * This method does any processing necessary to convert "fake"
+ * glyph indices used by the glyphProcessing method into "real" glyph
+diff --git a/src/share/native/sun/font/layout/OpenTypeTables.h b/src/share/native/sun/font/layout/OpenTypeTables.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeTables.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeTables.h
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -46,6 +46,8 @@
+ typedef le_uint16 Offset;
+ typedef le_uint8 ATag[4];
+ typedef le_uint32 fixed32;
++
++#define LE_GLYPH_GROUP_MASK 0x00000001UL
+ typedef le_uint32 FeatureMask;
+
+ #define SWAPT(atag) ((LETag) ((atag[0] << 24) + (atag[1] << 16) + (atag[2] << 8) + atag[3]))
+diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.cpp b/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -111,6 +111,10 @@
+ le_int32 probe = power;
+ le_int32 range = 0;
+
++ if (recordCount == 0) {
++ return -1;
++ }
++
+ if (SWAPW(records[extra].firstGlyph) <= glyphID) {
+ range = extra;
+ }
+diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
+@@ -101,7 +101,10 @@
+ valueRecord2->adjustPosition(SWAPW(valueFormat2), (char *) this, *glyphIterator, fontInstance);
+ }
+
+- return 2;
++ // back up glyphIterator so second glyph can be
++ // first glyph in the next pair
++ glyphIterator->prev();
++ return 1;
+ }
+
+ return 0;
+@@ -137,7 +140,10 @@
+ valueRecord2->adjustPosition(SWAPW(valueFormat2), (const char *) this, *glyphIterator, fontInstance);
+ }
+
+- return 2;
++ // back up glyphIterator so second glyph can be
++ // first glyph in the next pair
++ glyphIterator->prev();
++ return 1;
+ }
+
+ return 0;
+@@ -145,6 +151,20 @@
+
+ const PairValueRecord *PairPositioningFormat1Subtable::findPairValueRecord(TTGlyphID glyphID, const PairValueRecord *records, le_uint16 recordCount, le_uint16 recordSize) const
+ {
++#if 1
++ // The OpenType spec. says that the ValueRecord table is
++ // sorted by secondGlyph. Unfortunately, there are fonts
++ // around that have an unsorted ValueRecord table.
++ const PairValueRecord *record = records;
++
++ for(le_int32 r = 0; r < recordCount; r += 1) {
++ if (SWAPW(record->secondGlyph) == glyphID) {
++ return record;
++ }
++
++ record = (const PairValueRecord *) ((char *) record + recordSize);
++ }
++#else
+ le_uint8 bit = OpenTypeUtilities::highBit(recordCount);
+ le_uint16 power = 1 << bit;
+ le_uint16 extra = (recordCount - power) * recordSize;
+@@ -168,6 +188,7 @@
+ if (SWAPW(record->secondGlyph) == glyphID) {
+ return record;
+ }
++#endif
+
+ return NULL;
+ }
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.cpp b/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
+@@ -26,7 +26,7 @@
+ /*
+ *
+ *
+- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -56,20 +56,45 @@
+ return (const LangSysTable *) ((char *)this + langSysTableOffset);
+ }
+
+- return 0;
++ return NULL;
+ }
+
+ const ScriptTable *ScriptListTable::findScript(LETag scriptTag) const
+ {
++ /*
++ * There are some fonts that have a large, bogus value for scriptCount. To try
++ * and protect against this, we use the offset in the first scriptRecord,
++ * which we know has to be past the end of the scriptRecordArray, to compute
++ * a value which is greater than or equal to the actual script count.
++ *
++ * Note: normally, the first offset will point to just after the scriptRecordArray,
++ * but there's no guarantee of this, only that it's *after* the scriptRecordArray.
++ * Because of this, a binary serach isn't safe, because the new count may include
++ * data that's not actually in the scriptRecordArray and hence the array will appear
++ * to be unsorted.
++ */
+ le_uint16 count = SWAPW(scriptCount);
+- Offset scriptTableOffset =
+- OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count);
++ le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER;
++ Offset scriptTableOffset = 0;
++
++ if (count > limit) {
++ // the scriptCount value is bogus; do a linear search
++ // because limit may still be too large.
++ for(le_int32 s = 0; s < limit; s += 1) {
++ if (SWAPT(scriptRecordArray[s].tag) == scriptTag) {
++ scriptTableOffset = SWAPW(scriptRecordArray[s].offset);
++ break;
++ }
++ }
++ } else {
++ scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count);
++ }
+
+ if (scriptTableOffset != 0) {
+ return (const ScriptTable *) ((char *)this + scriptTableOffset);
+ }
+
+- return 0;
++ return NULL;
+ }
+
+ const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const
+@@ -77,7 +102,7 @@
+ const ScriptTable *scriptTable = findScript(scriptTag);
+
+ if (scriptTable == 0) {
+- return 0;
++ return NULL;
+ }
+
+ return scriptTable->findLanguage(languageTag, exactMatch);
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp b/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp
+@@ -25,10 +25,12 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
++ *
++ * Generated on: 10/26/2010 02:53:33 PM PDT
+ */
+
+ #include "LETypes.h"
+@@ -39,13 +41,13 @@
+
+ const LETag OpenTypeLayoutEngine::scriptTags[] = {
+ zyyyScriptTag, /* 'zyyy' (COMMON) */
+- qaaiScriptTag, /* 'qaai' (INHERITED) */
++ zinhScriptTag, /* 'zinh' (INHERITED) */
+ arabScriptTag, /* 'arab' (ARABIC) */
+ armnScriptTag, /* 'armn' (ARMENIAN) */
+ bengScriptTag, /* 'beng' (BENGALI) */
+ bopoScriptTag, /* 'bopo' (BOPOMOFO) */
+ cherScriptTag, /* 'cher' (CHEROKEE) */
+- qaacScriptTag, /* 'qaac' (COPTIC) */
++ coptScriptTag, /* 'copt' (COPTIC) */
+ cyrlScriptTag, /* 'cyrl' (CYRILLIC) */
+ dsrtScriptTag, /* 'dsrt' (DESERET) */
+ devaScriptTag, /* 'deva' (DEVANAGARI) */
+@@ -62,7 +64,7 @@
+ kndaScriptTag, /* 'knda' (KANNADA) */
+ kanaScriptTag, /* 'kana' (KATAKANA) */
+ khmrScriptTag, /* 'khmr' (KHMER) */
+- laooScriptTag, /* 'laoo' (LAO) */
++ laooScriptTag, /* 'lao ' (LAO) */
+ latnScriptTag, /* 'latn' (LATIN) */
+ mlymScriptTag, /* 'mlym' (MALAYALAM) */
+ mongScriptTag, /* 'mong' (MONGOLIAN) */
+@@ -79,7 +81,7 @@
+ thaiScriptTag, /* 'thai' (THAI) */
+ tibtScriptTag, /* 'tibt' (TIBETAN) */
+ cansScriptTag, /* 'cans' (CANADIAN_ABORIGINAL) */
+- yiiiScriptTag, /* 'yiii' (YI) */
++ yiiiScriptTag, /* 'yi ' (YI) */
+ tglgScriptTag, /* 'tglg' (TAGALOG) */
+ hanoScriptTag, /* 'hano' (HANUNOO) */
+ buhdScriptTag, /* 'buhd' (BUHID) */
+@@ -92,7 +94,99 @@
+ shawScriptTag, /* 'shaw' (SHAVIAN) */
+ taleScriptTag, /* 'tale' (TAI_LE) */
+ ugarScriptTag, /* 'ugar' (UGARITIC) */
+- hrktScriptTag /* 'hrkt' (KATAKANA_OR_HIRAGANA) */
++ hrktScriptTag, /* 'hrkt' (KATAKANA_OR_HIRAGANA) */
++ bugiScriptTag, /* 'bugi' (BUGINESE) */
++ glagScriptTag, /* 'glag' (GLAGOLITIC) */
++ kharScriptTag, /* 'khar' (KHAROSHTHI) */
++ syloScriptTag, /* 'sylo' (SYLOTI_NAGRI) */
++ taluScriptTag, /* 'talu' (NEW_TAI_LUE) */
++ tfngScriptTag, /* 'tfng' (TIFINAGH) */
++ xpeoScriptTag, /* 'xpeo' (OLD_PERSIAN) */
++ baliScriptTag, /* 'bali' (BALINESE) */
++ batkScriptTag, /* 'batk' (BATAK) */
++ blisScriptTag, /* 'blis' (BLIS) */
++ brahScriptTag, /* 'brah' (BRAHMI) */
++ chamScriptTag, /* 'cham' (CHAM) */
++ cirtScriptTag, /* 'cirt' (CIRT) */
++ cyrsScriptTag, /* 'cyrs' (CYRS) */
++ egydScriptTag, /* 'egyd' (EGYD) */
++ egyhScriptTag, /* 'egyh' (EGYH) */
++ egypScriptTag, /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */
++ geokScriptTag, /* 'geok' (GEOK) */
++ hansScriptTag, /* 'hans' (HANS) */
++ hantScriptTag, /* 'hant' (HANT) */
++ hmngScriptTag, /* 'hmng' (HMNG) */
++ hungScriptTag, /* 'hung' (HUNG) */
++ indsScriptTag, /* 'inds' (INDS) */
++ javaScriptTag, /* 'java' (JAVANESE) */
++ kaliScriptTag, /* 'kali' (KAYAH_LI) */
++ latfScriptTag, /* 'latf' (LATF) */
++ latgScriptTag, /* 'latg' (LATG) */
++ lepcScriptTag, /* 'lepc' (LEPCHA) */
++ linaScriptTag, /* 'lina' (LINA) */
++ mandScriptTag, /* 'mand' (MANDAIC) */
++ mayaScriptTag, /* 'maya' (MAYA) */
++ meroScriptTag, /* 'mero' (MERO) */
++ nkooScriptTag, /* 'nko ' (NKO) */
++ orkhScriptTag, /* 'orkh' (OLD_TURKIC) */
++ permScriptTag, /* 'perm' (PERM) */
++ phagScriptTag, /* 'phag' (PHAGS_PA) */
++ phnxScriptTag, /* 'phnx' (PHOENICIAN) */
++ plrdScriptTag, /* 'plrd' (PLRD) */
++ roroScriptTag, /* 'roro' (RORO) */
++ saraScriptTag, /* 'sara' (SARA) */
++ syreScriptTag, /* 'syre' (SYRE) */
++ syrjScriptTag, /* 'syrj' (SYRJ) */
++ syrnScriptTag, /* 'syrn' (SYRN) */
++ tengScriptTag, /* 'teng' (TENG) */
++ vaiiScriptTag, /* 'vai ' (VAI) */
++ vispScriptTag, /* 'visp' (VISP) */
++ xsuxScriptTag, /* 'xsux' (CUNEIFORM) */
++ zxxxScriptTag, /* 'zxxx' (ZXXX) */
++ zzzzScriptTag, /* 'zzzz' (UNKNOWN) */
++ cariScriptTag, /* 'cari' (CARIAN) */
++ jpanScriptTag, /* 'jpan' (JPAN) */
++ lanaScriptTag, /* 'lana' (TAI_THAM) */
++ lyciScriptTag, /* 'lyci' (LYCIAN) */
++ lydiScriptTag, /* 'lydi' (LYDIAN) */
++ olckScriptTag, /* 'olck' (OL_CHIKI) */
++ rjngScriptTag, /* 'rjng' (REJANG) */
++ saurScriptTag, /* 'saur' (SAURASHTRA) */
++ sgnwScriptTag, /* 'sgnw' (SGNW) */
++ sundScriptTag, /* 'sund' (SUNDANESE) */
++ moonScriptTag, /* 'moon' (MOON) */
++ mteiScriptTag, /* 'mtei' (MEETEI_MAYEK) */
++ armiScriptTag, /* 'armi' (IMPERIAL_ARAMAIC) */
++ avstScriptTag, /* 'avst' (AVESTAN) */
++ cakmScriptTag, /* 'cakm' (CAKM) */
++ koreScriptTag, /* 'kore' (KORE) */
++ kthiScriptTag, /* 'kthi' (KAITHI) */
++ maniScriptTag, /* 'mani' (MANI) */
++ phliScriptTag, /* 'phli' (INSCRIPTIONAL_PAHLAVI) */
++ phlpScriptTag, /* 'phlp' (PHLP) */
++ phlvScriptTag, /* 'phlv' (PHLV) */
++ prtiScriptTag, /* 'prti' (INSCRIPTIONAL_PARTHIAN) */
++ samrScriptTag, /* 'samr' (SAMARITAN) */
++ tavtScriptTag, /* 'tavt' (TAI_VIET) */
++ zmthScriptTag, /* 'zmth' (ZMTH) */
++ zsymScriptTag, /* 'zsym' (ZSYM) */
++ bamuScriptTag, /* 'bamu' (BAMUM) */
++ lisuScriptTag, /* 'lisu' (LISU) */
++ nkgbScriptTag, /* 'nkgb' (NKGB) */
++ sarbScriptTag, /* 'sarb' (OLD_SOUTH_ARABIAN) */
++ bassScriptTag, /* 'bass' (BASS) */
++ duplScriptTag, /* 'dupl' (DUPL) */
++ elbaScriptTag, /* 'elba' (ELBA) */
++ granScriptTag, /* 'gran' (GRAN) */
++ kpelScriptTag, /* 'kpel' (KPEL) */
++ lomaScriptTag, /* 'loma' (LOMA) */
++ mendScriptTag, /* 'mend' (MEND) */
++ mercScriptTag, /* 'merc' (MERC) */
++ narbScriptTag, /* 'narb' (NARB) */
++ nbatScriptTag, /* 'nbat' (NBAT) */
++ palmScriptTag, /* 'palm' (PALM) */
++ sindScriptTag, /* 'sind' (SIND) */
++ waraScriptTag /* 'wara' (WARA) */
+ };
+
+ const LETag OpenTypeLayoutEngine::languageTags[] = {
+@@ -125,7 +219,49 @@
+ urdLanguageTag, /* 'URD' (Urdu) */
+ zhpLanguageTag, /* 'ZHP' (Chinese (Phonetic)) */
+ zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */
+- zhtLanguageTag /* 'ZHT' (Chinese (Traditional)) */
++ zhtLanguageTag, /* 'ZHT' (Chinese (Traditional)) */
++ afkLanguageTag, /* 'AFK' (Afrikaans) */
++ belLanguageTag, /* 'BEL' (Belarussian) */
++ bgrLanguageTag, /* 'BGR' (Bulgarian) */
++ catLanguageTag, /* 'CAT' (Catalan) */
++ cheLanguageTag, /* 'CHE' (Chechen) */
++ copLanguageTag, /* 'COP' (Coptic) */
++ csyLanguageTag, /* 'CSY' (Czech) */
++ danLanguageTag, /* 'DAN' (Danish) */
++ deuLanguageTag, /* 'DEU' (German) */
++ dznLanguageTag, /* 'DZN' (Dzongkha) */
++ ellLanguageTag, /* 'ELL' (Greek) */
++ engLanguageTag, /* 'ENG' (English) */
++ espLanguageTag, /* 'ESP' (Spanish) */
++ etiLanguageTag, /* 'ETI' (Estonian) */
++ euqLanguageTag, /* 'EUQ' (Basque) */
++ finLanguageTag, /* 'FIN' (Finnish) */
++ fraLanguageTag, /* 'FRA' (French) */
++ gaeLanguageTag, /* 'GAE' (Gaelic) */
++ hauLanguageTag, /* 'HAU' (Hausa) */
++ hrvLanguageTag, /* 'HRV' (Croation) */
++ hunLanguageTag, /* 'HUN' (Hungarian) */
++ hyeLanguageTag, /* 'HYE' (Armenian) */
++ indLanguageTag, /* 'IND' (Indonesian) */
++ itaLanguageTag, /* 'ITA' (Italian) */
++ khmLanguageTag, /* 'KHM' (Khmer) */
++ mngLanguageTag, /* 'MNG' (Mongolian) */
++ mtsLanguageTag, /* 'MTS' (Maltese) */
++ nepLanguageTag, /* 'NEP' (Nepali) */
++ nldLanguageTag, /* 'NLD' (Dutch) */
++ pasLanguageTag, /* 'PAS' (Pashto) */
++ plkLanguageTag, /* 'PLK' (Polish) */
++ ptgLanguageTag, /* 'PTG' (Portuguese) */
++ romLanguageTag, /* 'ROM' (Romanian) */
++ rusLanguageTag, /* 'RUS' (Russian) */
++ skyLanguageTag, /* 'SKY' (Slovak) */
++ slvLanguageTag, /* 'SLV' (Slovenian) */
++ sqiLanguageTag, /* 'SQI' (Albanian) */
++ srbLanguageTag, /* 'SRB' (Serbian) */
++ sveLanguageTag, /* 'SVE' (Swedish) */
++ tibLanguageTag, /* 'TIB' (Tibetan) */
++ trkLanguageTag, /* 'TRK' (Turkish) */
++ welLanguageTag /* 'WEL' (Welsh) */
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.h b/src/share/native/sun/font/layout/ScriptAndLanguageTags.h
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h
+@@ -25,10 +25,12 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
++ *
++ * Generated on: 10/26/2010 02:53:33 PM PDT
+ */
+
+ #ifndef __SCRIPTANDLANGUAGES_H
+@@ -36,55 +38,64 @@
+
+ #include "LETypes.h"
+
+-U_NAMESPACE_BEGIN
+-
+ /**
+ * \file
+ * \internal
+ */
+
++U_NAMESPACE_BEGIN
++
+ const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */
+-const LETag qaaiScriptTag = 0x71616169; /* 'qaai' (INHERITED) */
++const LETag zinhScriptTag = 0x7A696E68; /* 'zinh' (INHERITED) */
+ const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */
+ const LETag armnScriptTag = 0x61726D6E; /* 'armn' (ARMENIAN) */
+ const LETag bengScriptTag = 0x62656E67; /* 'beng' (BENGALI) */
++const LETag bng2ScriptTag = 0x626E6732; /* 'bng2' (BENGALI v.2) (manually added) */
+ const LETag bopoScriptTag = 0x626F706F; /* 'bopo' (BOPOMOFO) */
+ const LETag cherScriptTag = 0x63686572; /* 'cher' (CHEROKEE) */
+-const LETag qaacScriptTag = 0x71616163; /* 'qaac' (COPTIC) */
++const LETag coptScriptTag = 0x636F7074; /* 'copt' (COPTIC) */
+ const LETag cyrlScriptTag = 0x6379726C; /* 'cyrl' (CYRILLIC) */
+ const LETag dsrtScriptTag = 0x64737274; /* 'dsrt' (DESERET) */
+ const LETag devaScriptTag = 0x64657661; /* 'deva' (DEVANAGARI) */
++const LETag dev2ScriptTag = 0x64657632; /* 'dev2' (DEVANAGARI v.2) (manually added) */
+ const LETag ethiScriptTag = 0x65746869; /* 'ethi' (ETHIOPIC) */
+ const LETag georScriptTag = 0x67656F72; /* 'geor' (GEORGIAN) */
+ const LETag gothScriptTag = 0x676F7468; /* 'goth' (GOTHIC) */
+ const LETag grekScriptTag = 0x6772656B; /* 'grek' (GREEK) */
+ const LETag gujrScriptTag = 0x67756A72; /* 'gujr' (GUJARATI) */
++const LETag gjr2ScriptTag = 0x676A7232; /* 'gjr2' (GUJARATI v.2) (manually added) */
+ const LETag guruScriptTag = 0x67757275; /* 'guru' (GURMUKHI) */
++const LETag gur2ScriptTag = 0x67757232; /* 'gur2' (GURMUKHI v.2) (manually added) */
+ const LETag haniScriptTag = 0x68616E69; /* 'hani' (HAN) */
+ const LETag hangScriptTag = 0x68616E67; /* 'hang' (HANGUL) */
+ const LETag hebrScriptTag = 0x68656272; /* 'hebr' (HEBREW) */
+ const LETag hiraScriptTag = 0x68697261; /* 'hira' (HIRAGANA) */
+ const LETag kndaScriptTag = 0x6B6E6461; /* 'knda' (KANNADA) */
++const LETag knd2ScriptTag = 0x6B6E6432; /* 'knd2' (KANNADA v.2) (manually added) */
+ const LETag kanaScriptTag = 0x6B616E61; /* 'kana' (KATAKANA) */
+ const LETag khmrScriptTag = 0x6B686D72; /* 'khmr' (KHMER) */
+-const LETag laooScriptTag = 0x6C616F6F; /* 'laoo' (LAO) */
++const LETag laooScriptTag = 0x6C616F20; /* 'lao ' (LAO) */
+ const LETag latnScriptTag = 0x6C61746E; /* 'latn' (LATIN) */
+ const LETag mlymScriptTag = 0x6D6C796D; /* 'mlym' (MALAYALAM) */
++const LETag mlm2ScriptTag = 0x6D6C6D32; /* 'mlm2' (MALAYALAM v.2) (manually added) */
+ const LETag mongScriptTag = 0x6D6F6E67; /* 'mong' (MONGOLIAN) */
+ const LETag mymrScriptTag = 0x6D796D72; /* 'mymr' (MYANMAR) */
+ const LETag ogamScriptTag = 0x6F67616D; /* 'ogam' (OGHAM) */
+ const LETag italScriptTag = 0x6974616C; /* 'ital' (OLD_ITALIC) */
+ const LETag oryaScriptTag = 0x6F727961; /* 'orya' (ORIYA) */
++const LETag ory2ScriptTag = 0x6F727932; /* 'ory2' (ORIYA v.2) (manually added) */
+ const LETag runrScriptTag = 0x72756E72; /* 'runr' (RUNIC) */
+ const LETag sinhScriptTag = 0x73696E68; /* 'sinh' (SINHALA) */
+ const LETag syrcScriptTag = 0x73797263; /* 'syrc' (SYRIAC) */
+ const LETag tamlScriptTag = 0x74616D6C; /* 'taml' (TAMIL) */
++const LETag tml2ScriptTag = 0x746D6C32; /* 'tml2' (TAMIL v.2) (manually added) */
+ const LETag teluScriptTag = 0x74656C75; /* 'telu' (TELUGU) */
++const LETag tel2ScriptTag = 0x74656C32; /* 'tel2' (TELUGU v.2) (manually added) */
+ const LETag thaaScriptTag = 0x74686161; /* 'thaa' (THAANA) */
+ const LETag thaiScriptTag = 0x74686169; /* 'thai' (THAI) */
+ const LETag tibtScriptTag = 0x74696274; /* 'tibt' (TIBETAN) */
+ const LETag cansScriptTag = 0x63616E73; /* 'cans' (CANADIAN_ABORIGINAL) */
+-const LETag yiiiScriptTag = 0x79696969; /* 'yiii' (YI) */
++const LETag yiiiScriptTag = 0x79692020; /* 'yi ' (YI) */
+ const LETag tglgScriptTag = 0x74676C67; /* 'tglg' (TAGALOG) */
+ const LETag hanoScriptTag = 0x68616E6F; /* 'hano' (HANUNOO) */
+ const LETag buhdScriptTag = 0x62756864; /* 'buhd' (BUHID) */
+@@ -98,6 +109,98 @@
+ const LETag taleScriptTag = 0x74616C65; /* 'tale' (TAI_LE) */
+ const LETag ugarScriptTag = 0x75676172; /* 'ugar' (UGARITIC) */
+ const LETag hrktScriptTag = 0x68726B74; /* 'hrkt' (KATAKANA_OR_HIRAGANA) */
++const LETag bugiScriptTag = 0x62756769; /* 'bugi' (BUGINESE) */
++const LETag glagScriptTag = 0x676C6167; /* 'glag' (GLAGOLITIC) */
++const LETag kharScriptTag = 0x6B686172; /* 'khar' (KHAROSHTHI) */
++const LETag syloScriptTag = 0x73796C6F; /* 'sylo' (SYLOTI_NAGRI) */
++const LETag taluScriptTag = 0x74616C75; /* 'talu' (NEW_TAI_LUE) */
++const LETag tfngScriptTag = 0x74666E67; /* 'tfng' (TIFINAGH) */
++const LETag xpeoScriptTag = 0x7870656F; /* 'xpeo' (OLD_PERSIAN) */
++const LETag baliScriptTag = 0x62616C69; /* 'bali' (BALINESE) */
++const LETag batkScriptTag = 0x6261746B; /* 'batk' (BATAK) */
++const LETag blisScriptTag = 0x626C6973; /* 'blis' (BLIS) */
++const LETag brahScriptTag = 0x62726168; /* 'brah' (BRAHMI) */
++const LETag chamScriptTag = 0x6368616D; /* 'cham' (CHAM) */
++const LETag cirtScriptTag = 0x63697274; /* 'cirt' (CIRT) */
++const LETag cyrsScriptTag = 0x63797273; /* 'cyrs' (CYRS) */
++const LETag egydScriptTag = 0x65677964; /* 'egyd' (EGYD) */
++const LETag egyhScriptTag = 0x65677968; /* 'egyh' (EGYH) */
++const LETag egypScriptTag = 0x65677970; /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */
++const LETag geokScriptTag = 0x67656F6B; /* 'geok' (GEOK) */
++const LETag hansScriptTag = 0x68616E73; /* 'hans' (HANS) */
++const LETag hantScriptTag = 0x68616E74; /* 'hant' (HANT) */
++const LETag hmngScriptTag = 0x686D6E67; /* 'hmng' (HMNG) */
++const LETag hungScriptTag = 0x68756E67; /* 'hung' (HUNG) */
++const LETag indsScriptTag = 0x696E6473; /* 'inds' (INDS) */
++const LETag javaScriptTag = 0x6A617661; /* 'java' (JAVANESE) */
++const LETag kaliScriptTag = 0x6B616C69; /* 'kali' (KAYAH_LI) */
++const LETag latfScriptTag = 0x6C617466; /* 'latf' (LATF) */
++const LETag latgScriptTag = 0x6C617467; /* 'latg' (LATG) */
++const LETag lepcScriptTag = 0x6C657063; /* 'lepc' (LEPCHA) */
++const LETag linaScriptTag = 0x6C696E61; /* 'lina' (LINA) */
++const LETag mandScriptTag = 0x6D616E64; /* 'mand' (MANDAIC) */
++const LETag mayaScriptTag = 0x6D617961; /* 'maya' (MAYA) */
++const LETag meroScriptTag = 0x6D65726F; /* 'mero' (MERO) */
++const LETag nkooScriptTag = 0x6E6B6F20; /* 'nko ' (NKO) */
++const LETag orkhScriptTag = 0x6F726B68; /* 'orkh' (OLD_TURKIC) */
++const LETag permScriptTag = 0x7065726D; /* 'perm' (PERM) */
++const LETag phagScriptTag = 0x70686167; /* 'phag' (PHAGS_PA) */
++const LETag phnxScriptTag = 0x70686E78; /* 'phnx' (PHOENICIAN) */
++const LETag plrdScriptTag = 0x706C7264; /* 'plrd' (PLRD) */
++const LETag roroScriptTag = 0x726F726F; /* 'roro' (RORO) */
++const LETag saraScriptTag = 0x73617261; /* 'sara' (SARA) */
++const LETag syreScriptTag = 0x73797265; /* 'syre' (SYRE) */
++const LETag syrjScriptTag = 0x7379726A; /* 'syrj' (SYRJ) */
++const LETag syrnScriptTag = 0x7379726E; /* 'syrn' (SYRN) */
++const LETag tengScriptTag = 0x74656E67; /* 'teng' (TENG) */
++const LETag vaiiScriptTag = 0x76616920; /* 'vai ' (VAI) */
++const LETag vispScriptTag = 0x76697370; /* 'visp' (VISP) */
++const LETag xsuxScriptTag = 0x78737578; /* 'xsux' (CUNEIFORM) */
++const LETag zxxxScriptTag = 0x7A787878; /* 'zxxx' (ZXXX) */
++const LETag zzzzScriptTag = 0x7A7A7A7A; /* 'zzzz' (UNKNOWN) */
++const LETag cariScriptTag = 0x63617269; /* 'cari' (CARIAN) */
++const LETag jpanScriptTag = 0x6A70616E; /* 'jpan' (JPAN) */
++const LETag lanaScriptTag = 0x6C616E61; /* 'lana' (TAI_THAM) */
++const LETag lyciScriptTag = 0x6C796369; /* 'lyci' (LYCIAN) */
++const LETag lydiScriptTag = 0x6C796469; /* 'lydi' (LYDIAN) */
++const LETag olckScriptTag = 0x6F6C636B; /* 'olck' (OL_CHIKI) */
++const LETag rjngScriptTag = 0x726A6E67; /* 'rjng' (REJANG) */
++const LETag saurScriptTag = 0x73617572; /* 'saur' (SAURASHTRA) */
++const LETag sgnwScriptTag = 0x73676E77; /* 'sgnw' (SGNW) */
++const LETag sundScriptTag = 0x73756E64; /* 'sund' (SUNDANESE) */
++const LETag moonScriptTag = 0x6D6F6F6E; /* 'moon' (MOON) */
++const LETag mteiScriptTag = 0x6D746569; /* 'mtei' (MEETEI_MAYEK) */
++const LETag armiScriptTag = 0x61726D69; /* 'armi' (IMPERIAL_ARAMAIC) */
++const LETag avstScriptTag = 0x61767374; /* 'avst' (AVESTAN) */
++const LETag cakmScriptTag = 0x63616B6D; /* 'cakm' (CAKM) */
++const LETag koreScriptTag = 0x6B6F7265; /* 'kore' (KORE) */
++const LETag kthiScriptTag = 0x6B746869; /* 'kthi' (KAITHI) */
++const LETag maniScriptTag = 0x6D616E69; /* 'mani' (MANI) */
++const LETag phliScriptTag = 0x70686C69; /* 'phli' (INSCRIPTIONAL_PAHLAVI) */
++const LETag phlpScriptTag = 0x70686C70; /* 'phlp' (PHLP) */
++const LETag phlvScriptTag = 0x70686C76; /* 'phlv' (PHLV) */
++const LETag prtiScriptTag = 0x70727469; /* 'prti' (INSCRIPTIONAL_PARTHIAN) */
++const LETag samrScriptTag = 0x73616D72; /* 'samr' (SAMARITAN) */
++const LETag tavtScriptTag = 0x74617674; /* 'tavt' (TAI_VIET) */
++const LETag zmthScriptTag = 0x7A6D7468; /* 'zmth' (ZMTH) */
++const LETag zsymScriptTag = 0x7A73796D; /* 'zsym' (ZSYM) */
++const LETag bamuScriptTag = 0x62616D75; /* 'bamu' (BAMUM) */
++const LETag lisuScriptTag = 0x6C697375; /* 'lisu' (LISU) */
++const LETag nkgbScriptTag = 0x6E6B6762; /* 'nkgb' (NKGB) */
++const LETag sarbScriptTag = 0x73617262; /* 'sarb' (OLD_SOUTH_ARABIAN) */
++const LETag bassScriptTag = 0x62617373; /* 'bass' (BASS) */
++const LETag duplScriptTag = 0x6475706C; /* 'dupl' (DUPL) */
++const LETag elbaScriptTag = 0x656C6261; /* 'elba' (ELBA) */
++const LETag granScriptTag = 0x6772616E; /* 'gran' (GRAN) */
++const LETag kpelScriptTag = 0x6B70656C; /* 'kpel' (KPEL) */
++const LETag lomaScriptTag = 0x6C6F6D61; /* 'loma' (LOMA) */
++const LETag mendScriptTag = 0x6D656E64; /* 'mend' (MEND) */
++const LETag mercScriptTag = 0x6D657263; /* 'merc' (MERC) */
++const LETag narbScriptTag = 0x6E617262; /* 'narb' (NARB) */
++const LETag nbatScriptTag = 0x6E626174; /* 'nbat' (NBAT) */
++const LETag palmScriptTag = 0x70616C6D; /* 'palm' (PALM) */
++const LETag sindScriptTag = 0x73696E64; /* 'sind' (SIND) */
++const LETag waraScriptTag = 0x77617261; /* 'wara' (WARA) */
+
+ const LETag nullScriptTag = 0x00000000; /* '' (NULL) */
+
+@@ -132,6 +235,48 @@
+ const LETag zhpLanguageTag = 0x5A485020; /* 'ZHP' (Chinese (Phonetic)) */
+ const LETag zhsLanguageTag = 0x5A485320; /* 'ZHS' (Chinese (Simplified)) */
+ const LETag zhtLanguageTag = 0x5A485420; /* 'ZHT' (Chinese (Traditional)) */
++const LETag afkLanguageTag = 0x41464B20; /* 'AFK' (Afrikaans) */
++const LETag belLanguageTag = 0x42454C20; /* 'BEL' (Belarussian) */
++const LETag bgrLanguageTag = 0x42475220; /* 'BGR' (Bulgarian) */
++const LETag catLanguageTag = 0x43415420; /* 'CAT' (Catalan) */
++const LETag cheLanguageTag = 0x43484520; /* 'CHE' (Chechen) */
++const LETag copLanguageTag = 0x434F5020; /* 'COP' (Coptic) */
++const LETag csyLanguageTag = 0x43535920; /* 'CSY' (Czech) */
++const LETag danLanguageTag = 0x44414E20; /* 'DAN' (Danish) */
++const LETag deuLanguageTag = 0x44455520; /* 'DEU' (German) */
++const LETag dznLanguageTag = 0x445A4E20; /* 'DZN' (Dzongkha) */
++const LETag ellLanguageTag = 0x454C4C20; /* 'ELL' (Greek) */
++const LETag engLanguageTag = 0x454E4720; /* 'ENG' (English) */
++const LETag espLanguageTag = 0x45535020; /* 'ESP' (Spanish) */
++const LETag etiLanguageTag = 0x45544920; /* 'ETI' (Estonian) */
++const LETag euqLanguageTag = 0x45555120; /* 'EUQ' (Basque) */
++const LETag finLanguageTag = 0x46494E20; /* 'FIN' (Finnish) */
++const LETag fraLanguageTag = 0x46524120; /* 'FRA' (French) */
++const LETag gaeLanguageTag = 0x47414520; /* 'GAE' (Gaelic) */
++const LETag hauLanguageTag = 0x48415520; /* 'HAU' (Hausa) */
++const LETag hrvLanguageTag = 0x48525620; /* 'HRV' (Croation) */
++const LETag hunLanguageTag = 0x48554E20; /* 'HUN' (Hungarian) */
++const LETag hyeLanguageTag = 0x48594520; /* 'HYE' (Armenian) */
++const LETag indLanguageTag = 0x494E4420; /* 'IND' (Indonesian) */
++const LETag itaLanguageTag = 0x49544120; /* 'ITA' (Italian) */
++const LETag khmLanguageTag = 0x4B484D20; /* 'KHM' (Khmer) */
++const LETag mngLanguageTag = 0x4D4E4720; /* 'MNG' (Mongolian) */
++const LETag mtsLanguageTag = 0x4D545320; /* 'MTS' (Maltese) */
++const LETag nepLanguageTag = 0x4E455020; /* 'NEP' (Nepali) */
++const LETag nldLanguageTag = 0x4E4C4420; /* 'NLD' (Dutch) */
++const LETag pasLanguageTag = 0x50415320; /* 'PAS' (Pashto) */
++const LETag plkLanguageTag = 0x504C4B20; /* 'PLK' (Polish) */
++const LETag ptgLanguageTag = 0x50544720; /* 'PTG' (Portuguese) */
++const LETag romLanguageTag = 0x524F4D20; /* 'ROM' (Romanian) */
++const LETag rusLanguageTag = 0x52555320; /* 'RUS' (Russian) */
++const LETag skyLanguageTag = 0x534B5920; /* 'SKY' (Slovak) */
++const LETag slvLanguageTag = 0x534C5620; /* 'SLV' (Slovenian) */
++const LETag sqiLanguageTag = 0x53514920; /* 'SQI' (Albanian) */
++const LETag srbLanguageTag = 0x53524220; /* 'SRB' (Serbian) */
++const LETag sveLanguageTag = 0x53564520; /* 'SVE' (Swedish) */
++const LETag tibLanguageTag = 0x54494220; /* 'TIB' (Tibetan) */
++const LETag trkLanguageTag = 0x54524B20; /* 'TRK' (Turkish) */
++const LETag welLanguageTag = 0x57454C20; /* 'WEL' (Welsh) */
+
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp b/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+@@ -74,7 +74,7 @@
+
+ if (offset != 0) {
+ TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset);
+- TTGlyphID newGlyph = (TTGlyphID)SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]);
++ TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]);
+
+ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
+ }
+diff --git a/src/share/native/sun/font/layout/ShapingTypeData.cpp b/src/share/native/sun/font/layout/ShapingTypeData.cpp
+--- jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp
++++ jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved.
++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved.
+ *
+ * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
+ * YOU REALLY KNOW WHAT YOU'RE DOING.
+@@ -39,72 +39,87 @@
+ U_NAMESPACE_BEGIN
+
+ const le_uint8 ArabicShaping::shapingTypeTable[] = {
+- 0x00, 0x02, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05,
+- 0x04, 0x83, 0x04, 0x86, 0x00, 0x05, 0x04, 0x88, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xB9,
+- 0x00, 0x05, 0x05, 0xBB, 0x05, 0xBD, 0x00, 0x05, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x05, 0x05, 0xC1,
+- 0x05, 0xC2, 0x00, 0x05, 0x05, 0xC4, 0x05, 0xC5, 0x00, 0x05, 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x05,
+- 0x06, 0x10, 0x06, 0x15, 0x00, 0x05, 0x06, 0x22, 0x06, 0x25, 0x00, 0x04, 0x06, 0x26, 0x06, 0x26,
+- 0x00, 0x02, 0x06, 0x27, 0x06, 0x27, 0x00, 0x04, 0x06, 0x28, 0x06, 0x28, 0x00, 0x02, 0x06, 0x29,
+- 0x06, 0x29, 0x00, 0x04, 0x06, 0x2A, 0x06, 0x2E, 0x00, 0x02, 0x06, 0x2F, 0x06, 0x32, 0x00, 0x04,
+- 0x06, 0x33, 0x06, 0x3A, 0x00, 0x02, 0x06, 0x40, 0x06, 0x40, 0x00, 0x01, 0x06, 0x41, 0x06, 0x47,
+- 0x00, 0x02, 0x06, 0x48, 0x06, 0x48, 0x00, 0x04, 0x06, 0x49, 0x06, 0x4A, 0x00, 0x02, 0x06, 0x4B,
+- 0x06, 0x5E, 0x00, 0x05, 0x06, 0x6E, 0x06, 0x6F, 0x00, 0x02, 0x06, 0x70, 0x06, 0x70, 0x00, 0x05,
+- 0x06, 0x71, 0x06, 0x73, 0x00, 0x04, 0x06, 0x75, 0x06, 0x77, 0x00, 0x04, 0x06, 0x78, 0x06, 0x87,
+- 0x00, 0x02, 0x06, 0x88, 0x06, 0x99, 0x00, 0x04, 0x06, 0x9A, 0x06, 0xBF, 0x00, 0x02, 0x06, 0xC0,
+- 0x06, 0xC0, 0x00, 0x04, 0x06, 0xC1, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, 0x06, 0xCB, 0x00, 0x04,
+- 0x06, 0xCC, 0x06, 0xCC, 0x00, 0x02, 0x06, 0xCD, 0x06, 0xCD, 0x00, 0x04, 0x06, 0xCE, 0x06, 0xCE,
+- 0x00, 0x02, 0x06, 0xCF, 0x06, 0xCF, 0x00, 0x04, 0x06, 0xD0, 0x06, 0xD1, 0x00, 0x02, 0x06, 0xD2,
+- 0x06, 0xD3, 0x00, 0x04, 0x06, 0xD5, 0x06, 0xD5, 0x00, 0x04, 0x06, 0xD6, 0x06, 0xDC, 0x00, 0x05,
+- 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x05, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x05, 0x06, 0xEA, 0x06, 0xED,
+- 0x00, 0x05, 0x06, 0xEE, 0x06, 0xEF, 0x00, 0x04, 0x06, 0xFA, 0x06, 0xFC, 0x00, 0x02, 0x06, 0xFF,
+- 0x06, 0xFF, 0x00, 0x02, 0x07, 0x0F, 0x07, 0x0F, 0x00, 0x05, 0x07, 0x10, 0x07, 0x10, 0x00, 0x04,
+- 0x07, 0x11, 0x07, 0x11, 0x00, 0x05, 0x07, 0x12, 0x07, 0x14, 0x00, 0x02, 0x07, 0x15, 0x07, 0x19,
+- 0x00, 0x04, 0x07, 0x1A, 0x07, 0x1D, 0x00, 0x02, 0x07, 0x1E, 0x07, 0x1E, 0x00, 0x04, 0x07, 0x1F,
+- 0x07, 0x27, 0x00, 0x02, 0x07, 0x28, 0x07, 0x28, 0x00, 0x04, 0x07, 0x29, 0x07, 0x29, 0x00, 0x02,
+- 0x07, 0x2A, 0x07, 0x2A, 0x00, 0x04, 0x07, 0x2B, 0x07, 0x2B, 0x00, 0x02, 0x07, 0x2C, 0x07, 0x2C,
+- 0x00, 0x04, 0x07, 0x2D, 0x07, 0x2E, 0x00, 0x02, 0x07, 0x2F, 0x07, 0x2F, 0x00, 0x04, 0x07, 0x30,
+- 0x07, 0x4A, 0x00, 0x05, 0x07, 0x4D, 0x07, 0x4D, 0x00, 0x04, 0x07, 0x4E, 0x07, 0x58, 0x00, 0x02,
+- 0x07, 0x59, 0x07, 0x5B, 0x00, 0x04, 0x07, 0x5C, 0x07, 0x6A, 0x00, 0x02, 0x07, 0x6B, 0x07, 0x6C,
+- 0x00, 0x04, 0x07, 0x6D, 0x07, 0x6D, 0x00, 0x02, 0x07, 0xA6, 0x07, 0xB0, 0x00, 0x05, 0x09, 0x01,
+- 0x09, 0x02, 0x00, 0x05, 0x09, 0x3C, 0x09, 0x3C, 0x00, 0x05, 0x09, 0x41, 0x09, 0x48, 0x00, 0x05,
+- 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x05, 0x09, 0x51, 0x09, 0x54, 0x00, 0x05, 0x09, 0x62, 0x09, 0x63,
+- 0x00, 0x05, 0x09, 0x81, 0x09, 0x81, 0x00, 0x05, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x05, 0x09, 0xC1,
+- 0x09, 0xC4, 0x00, 0x05, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x05, 0x09, 0xE2, 0x09, 0xE3, 0x00, 0x05,
+- 0x0A, 0x01, 0x0A, 0x02, 0x00, 0x05, 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x05, 0x0A, 0x41, 0x0A, 0x42,
+- 0x00, 0x05, 0x0A, 0x47, 0x0A, 0x48, 0x00, 0x05, 0x0A, 0x4B, 0x0A, 0x4D, 0x00, 0x05, 0x0A, 0x70,
+- 0x0A, 0x71, 0x00, 0x05, 0x0A, 0x81, 0x0A, 0x82, 0x00, 0x05, 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x05,
+- 0x0A, 0xC1, 0x0A, 0xC5, 0x00, 0x05, 0x0A, 0xC7, 0x0A, 0xC8, 0x00, 0x05, 0x0A, 0xCD, 0x0A, 0xCD,
+- 0x00, 0x05, 0x0A, 0xE2, 0x0A, 0xE3, 0x00, 0x05, 0x0B, 0x01, 0x0B, 0x01, 0x00, 0x05, 0x0B, 0x3C,
+- 0x0B, 0x3C, 0x00, 0x05, 0x0B, 0x3F, 0x0B, 0x3F, 0x00, 0x05, 0x0B, 0x41, 0x0B, 0x43, 0x00, 0x05,
+- 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x05, 0x0B, 0x56, 0x0B, 0x56, 0x00, 0x05, 0x0B, 0x82, 0x0B, 0x82,
+- 0x00, 0x05, 0x0B, 0xC0, 0x0B, 0xC0, 0x00, 0x05, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x05, 0x0C, 0x3E,
+- 0x0C, 0x40, 0x00, 0x05, 0x0C, 0x46, 0x0C, 0x48, 0x00, 0x05, 0x0C, 0x4A, 0x0C, 0x4D, 0x00, 0x05,
+- 0x0C, 0x55, 0x0C, 0x56, 0x00, 0x05, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x05, 0x0C, 0xBF, 0x0C, 0xBF,
+- 0x00, 0x05, 0x0C, 0xC6, 0x0C, 0xC6, 0x00, 0x05, 0x0C, 0xCC, 0x0C, 0xCD, 0x00, 0x05, 0x0D, 0x41,
+- 0x0D, 0x43, 0x00, 0x05, 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x05, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x05,
+- 0x0D, 0xD2, 0x0D, 0xD4, 0x00, 0x05, 0x0D, 0xD6, 0x0D, 0xD6, 0x00, 0x05, 0x0E, 0x31, 0x0E, 0x31,
+- 0x00, 0x05, 0x0E, 0x34, 0x0E, 0x3A, 0x00, 0x05, 0x0E, 0x47, 0x0E, 0x4E, 0x00, 0x05, 0x0E, 0xB1,
+- 0x0E, 0xB1, 0x00, 0x05, 0x0E, 0xB4, 0x0E, 0xB9, 0x00, 0x05, 0x0E, 0xBB, 0x0E, 0xBC, 0x00, 0x05,
+- 0x0E, 0xC8, 0x0E, 0xCD, 0x00, 0x05, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0x05, 0x0F, 0x35, 0x0F, 0x35,
+- 0x00, 0x05, 0x0F, 0x37, 0x0F, 0x37, 0x00, 0x05, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0x05, 0x0F, 0x71,
+- 0x0F, 0x7E, 0x00, 0x05, 0x0F, 0x80, 0x0F, 0x84, 0x00, 0x05, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0x05,
+- 0x0F, 0x90, 0x0F, 0x97, 0x00, 0x05, 0x0F, 0x99, 0x0F, 0xBC, 0x00, 0x05, 0x0F, 0xC6, 0x0F, 0xC6,
+- 0x00, 0x05, 0x10, 0x2D, 0x10, 0x30, 0x00, 0x05, 0x10, 0x32, 0x10, 0x32, 0x00, 0x05, 0x10, 0x36,
+- 0x10, 0x37, 0x00, 0x05, 0x10, 0x39, 0x10, 0x39, 0x00, 0x05, 0x10, 0x58, 0x10, 0x59, 0x00, 0x05,
+- 0x13, 0x5F, 0x13, 0x5F, 0x00, 0x05, 0x17, 0x12, 0x17, 0x14, 0x00, 0x05, 0x17, 0x32, 0x17, 0x34,
+- 0x00, 0x05, 0x17, 0x52, 0x17, 0x53, 0x00, 0x05, 0x17, 0x72, 0x17, 0x73, 0x00, 0x05, 0x17, 0xB4,
+- 0x17, 0xB5, 0x00, 0x05, 0x17, 0xB7, 0x17, 0xBD, 0x00, 0x05, 0x17, 0xC6, 0x17, 0xC6, 0x00, 0x05,
+- 0x17, 0xC9, 0x17, 0xD3, 0x00, 0x05, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0x05, 0x18, 0x0B, 0x18, 0x0D,
+- 0x00, 0x05, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0x05, 0x19, 0x20, 0x19, 0x22, 0x00, 0x05, 0x19, 0x27,
+- 0x19, 0x28, 0x00, 0x05, 0x19, 0x32, 0x19, 0x32, 0x00, 0x05, 0x19, 0x39, 0x19, 0x3B, 0x00, 0x05,
+- 0x1A, 0x17, 0x1A, 0x18, 0x00, 0x05, 0x1D, 0xC0, 0x1D, 0xC3, 0x00, 0x05, 0x20, 0x0B, 0x20, 0x0B,
+- 0x00, 0x05, 0x20, 0x0D, 0x20, 0x0D, 0x00, 0x01, 0x20, 0x0E, 0x20, 0x0F, 0x00, 0x05, 0x20, 0x2A,
+- 0x20, 0x2E, 0x00, 0x05, 0x20, 0x60, 0x20, 0x63, 0x00, 0x05, 0x20, 0x6A, 0x20, 0x6F, 0x00, 0x05,
+- 0x20, 0xD0, 0x20, 0xEB, 0x00, 0x05, 0x30, 0x2A, 0x30, 0x2F, 0x00, 0x05, 0x30, 0x99, 0x30, 0x9A,
+- 0x00, 0x05, 0xA8, 0x06, 0xA8, 0x06, 0x00, 0x05, 0xA8, 0x0B, 0xA8, 0x0B, 0x00, 0x05, 0xA8, 0x25,
+- 0xA8, 0x26, 0x00, 0x05, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x05, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x05,
+- 0xFE, 0x20, 0xFE, 0x23, 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB,
+- 0x00, 0x05
++ 0x00, 0x02, 0x00, 0xD7, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05,
++ 0x04, 0x83, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xBD, 0x00, 0x05, 0x05, 0xBF, 0x05, 0xBF,
++ 0x00, 0x05, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x05, 0x05, 0xC4, 0x05, 0xC5, 0x00, 0x05, 0x05, 0xC7,
++ 0x05, 0xC7, 0x00, 0x05, 0x06, 0x10, 0x06, 0x1A, 0x00, 0x05, 0x06, 0x22, 0x06, 0x25, 0x00, 0x04,
++ 0x06, 0x26, 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x27, 0x00, 0x04, 0x06, 0x28, 0x06, 0x28,
++ 0x00, 0x02, 0x06, 0x29, 0x06, 0x29, 0x00, 0x04, 0x06, 0x2A, 0x06, 0x2E, 0x00, 0x02, 0x06, 0x2F,
++ 0x06, 0x32, 0x00, 0x04, 0x06, 0x33, 0x06, 0x3F, 0x00, 0x02, 0x06, 0x40, 0x06, 0x40, 0x00, 0x01,
++ 0x06, 0x41, 0x06, 0x47, 0x00, 0x02, 0x06, 0x48, 0x06, 0x48, 0x00, 0x04, 0x06, 0x49, 0x06, 0x4A,
++ 0x00, 0x02, 0x06, 0x4B, 0x06, 0x5E, 0x00, 0x05, 0x06, 0x6E, 0x06, 0x6F, 0x00, 0x02, 0x06, 0x70,
++ 0x06, 0x70, 0x00, 0x05, 0x06, 0x71, 0x06, 0x73, 0x00, 0x04, 0x06, 0x75, 0x06, 0x77, 0x00, 0x04,
++ 0x06, 0x78, 0x06, 0x87, 0x00, 0x02, 0x06, 0x88, 0x06, 0x99, 0x00, 0x04, 0x06, 0x9A, 0x06, 0xBF,
++ 0x00, 0x02, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x04, 0x06, 0xC1, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3,
++ 0x06, 0xCB, 0x00, 0x04, 0x06, 0xCC, 0x06, 0xCC, 0x00, 0x02, 0x06, 0xCD, 0x06, 0xCD, 0x00, 0x04,
++ 0x06, 0xCE, 0x06, 0xCE, 0x00, 0x02, 0x06, 0xCF, 0x06, 0xCF, 0x00, 0x04, 0x06, 0xD0, 0x06, 0xD1,
++ 0x00, 0x02, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x06, 0xD5, 0x06, 0xD5, 0x00, 0x04, 0x06, 0xD6,
++ 0x06, 0xDC, 0x00, 0x05, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x05, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x05,
++ 0x06, 0xEA, 0x06, 0xED, 0x00, 0x05, 0x06, 0xEE, 0x06, 0xEF, 0x00, 0x04, 0x06, 0xFA, 0x06, 0xFC,
++ 0x00, 0x02, 0x06, 0xFF, 0x06, 0xFF, 0x00, 0x02, 0x07, 0x0F, 0x07, 0x0F, 0x00, 0x05, 0x07, 0x10,
++ 0x07, 0x10, 0x00, 0x04, 0x07, 0x11, 0x07, 0x11, 0x00, 0x05, 0x07, 0x12, 0x07, 0x14, 0x00, 0x02,
++ 0x07, 0x15, 0x07, 0x19, 0x00, 0x04, 0x07, 0x1A, 0x07, 0x1D, 0x00, 0x02, 0x07, 0x1E, 0x07, 0x1E,
++ 0x00, 0x04, 0x07, 0x1F, 0x07, 0x27, 0x00, 0x02, 0x07, 0x28, 0x07, 0x28, 0x00, 0x04, 0x07, 0x29,
++ 0x07, 0x29, 0x00, 0x02, 0x07, 0x2A, 0x07, 0x2A, 0x00, 0x04, 0x07, 0x2B, 0x07, 0x2B, 0x00, 0x02,
++ 0x07, 0x2C, 0x07, 0x2C, 0x00, 0x04, 0x07, 0x2D, 0x07, 0x2E, 0x00, 0x02, 0x07, 0x2F, 0x07, 0x2F,
++ 0x00, 0x04, 0x07, 0x30, 0x07, 0x4A, 0x00, 0x05, 0x07, 0x4D, 0x07, 0x4D, 0x00, 0x04, 0x07, 0x4E,
++ 0x07, 0x58, 0x00, 0x02, 0x07, 0x59, 0x07, 0x5B, 0x00, 0x04, 0x07, 0x5C, 0x07, 0x6A, 0x00, 0x02,
++ 0x07, 0x6B, 0x07, 0x6C, 0x00, 0x04, 0x07, 0x6D, 0x07, 0x70, 0x00, 0x02, 0x07, 0x71, 0x07, 0x71,
++ 0x00, 0x04, 0x07, 0x72, 0x07, 0x72, 0x00, 0x02, 0x07, 0x73, 0x07, 0x74, 0x00, 0x04, 0x07, 0x75,
++ 0x07, 0x77, 0x00, 0x02, 0x07, 0x78, 0x07, 0x79, 0x00, 0x04, 0x07, 0x7A, 0x07, 0x7F, 0x00, 0x02,
++ 0x07, 0xA6, 0x07, 0xB0, 0x00, 0x05, 0x07, 0xCA, 0x07, 0xEA, 0x00, 0x02, 0x07, 0xEB, 0x07, 0xF3,
++ 0x00, 0x05, 0x07, 0xFA, 0x07, 0xFA, 0x00, 0x01, 0x09, 0x01, 0x09, 0x02, 0x00, 0x05, 0x09, 0x3C,
++ 0x09, 0x3C, 0x00, 0x05, 0x09, 0x41, 0x09, 0x48, 0x00, 0x05, 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x05,
++ 0x09, 0x51, 0x09, 0x54, 0x00, 0x05, 0x09, 0x62, 0x09, 0x63, 0x00, 0x05, 0x09, 0x81, 0x09, 0x81,
++ 0x00, 0x05, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x05, 0x09, 0xC1, 0x09, 0xC4, 0x00, 0x05, 0x09, 0xCD,
++ 0x09, 0xCD, 0x00, 0x05, 0x09, 0xE2, 0x09, 0xE3, 0x00, 0x05, 0x0A, 0x01, 0x0A, 0x02, 0x00, 0x05,
++ 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x05, 0x0A, 0x41, 0x0A, 0x42, 0x00, 0x05, 0x0A, 0x47, 0x0A, 0x48,
++ 0x00, 0x05, 0x0A, 0x4B, 0x0A, 0x4D, 0x00, 0x05, 0x0A, 0x51, 0x0A, 0x51, 0x00, 0x05, 0x0A, 0x70,
++ 0x0A, 0x71, 0x00, 0x05, 0x0A, 0x75, 0x0A, 0x75, 0x00, 0x05, 0x0A, 0x81, 0x0A, 0x82, 0x00, 0x05,
++ 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x05, 0x0A, 0xC1, 0x0A, 0xC5, 0x00, 0x05, 0x0A, 0xC7, 0x0A, 0xC8,
++ 0x00, 0x05, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x05, 0x0A, 0xE2, 0x0A, 0xE3, 0x00, 0x05, 0x0B, 0x01,
++ 0x0B, 0x01, 0x00, 0x05, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x05, 0x0B, 0x3F, 0x0B, 0x3F, 0x00, 0x05,
++ 0x0B, 0x41, 0x0B, 0x44, 0x00, 0x05, 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x05, 0x0B, 0x56, 0x0B, 0x56,
++ 0x00, 0x05, 0x0B, 0x62, 0x0B, 0x63, 0x00, 0x05, 0x0B, 0x82, 0x0B, 0x82, 0x00, 0x05, 0x0B, 0xC0,
++ 0x0B, 0xC0, 0x00, 0x05, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x05, 0x0C, 0x3E, 0x0C, 0x40, 0x00, 0x05,
++ 0x0C, 0x46, 0x0C, 0x48, 0x00, 0x05, 0x0C, 0x4A, 0x0C, 0x4D, 0x00, 0x05, 0x0C, 0x55, 0x0C, 0x56,
++ 0x00, 0x05, 0x0C, 0x62, 0x0C, 0x63, 0x00, 0x05, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x05, 0x0C, 0xBF,
++ 0x0C, 0xBF, 0x00, 0x05, 0x0C, 0xC6, 0x0C, 0xC6, 0x00, 0x05, 0x0C, 0xCC, 0x0C, 0xCD, 0x00, 0x05,
++ 0x0C, 0xE2, 0x0C, 0xE3, 0x00, 0x05, 0x0D, 0x41, 0x0D, 0x44, 0x00, 0x05, 0x0D, 0x4D, 0x0D, 0x4D,
++ 0x00, 0x05, 0x0D, 0x62, 0x0D, 0x63, 0x00, 0x05, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x05, 0x0D, 0xD2,
++ 0x0D, 0xD4, 0x00, 0x05, 0x0D, 0xD6, 0x0D, 0xD6, 0x00, 0x05, 0x0E, 0x31, 0x0E, 0x31, 0x00, 0x05,
++ 0x0E, 0x34, 0x0E, 0x3A, 0x00, 0x05, 0x0E, 0x47, 0x0E, 0x4E, 0x00, 0x05, 0x0E, 0xB1, 0x0E, 0xB1,
++ 0x00, 0x05, 0x0E, 0xB4, 0x0E, 0xB9, 0x00, 0x05, 0x0E, 0xBB, 0x0E, 0xBC, 0x00, 0x05, 0x0E, 0xC8,
++ 0x0E, 0xCD, 0x00, 0x05, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0x05, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0x05,
++ 0x0F, 0x37, 0x0F, 0x37, 0x00, 0x05, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0x05, 0x0F, 0x71, 0x0F, 0x7E,
++ 0x00, 0x05, 0x0F, 0x80, 0x0F, 0x84, 0x00, 0x05, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0x05, 0x0F, 0x90,
++ 0x0F, 0x97, 0x00, 0x05, 0x0F, 0x99, 0x0F, 0xBC, 0x00, 0x05, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0x05,
++ 0x10, 0x2D, 0x10, 0x30, 0x00, 0x05, 0x10, 0x32, 0x10, 0x37, 0x00, 0x05, 0x10, 0x39, 0x10, 0x3A,
++ 0x00, 0x05, 0x10, 0x3D, 0x10, 0x3E, 0x00, 0x05, 0x10, 0x58, 0x10, 0x59, 0x00, 0x05, 0x10, 0x5E,
++ 0x10, 0x60, 0x00, 0x05, 0x10, 0x71, 0x10, 0x74, 0x00, 0x05, 0x10, 0x82, 0x10, 0x82, 0x00, 0x05,
++ 0x10, 0x85, 0x10, 0x86, 0x00, 0x05, 0x10, 0x8D, 0x10, 0x8D, 0x00, 0x05, 0x13, 0x5F, 0x13, 0x5F,
++ 0x00, 0x05, 0x17, 0x12, 0x17, 0x14, 0x00, 0x05, 0x17, 0x32, 0x17, 0x34, 0x00, 0x05, 0x17, 0x52,
++ 0x17, 0x53, 0x00, 0x05, 0x17, 0x72, 0x17, 0x73, 0x00, 0x05, 0x17, 0xB4, 0x17, 0xB5, 0x00, 0x05,
++ 0x17, 0xB7, 0x17, 0xBD, 0x00, 0x05, 0x17, 0xC6, 0x17, 0xC6, 0x00, 0x05, 0x17, 0xC9, 0x17, 0xD3,
++ 0x00, 0x05, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0x05, 0x18, 0x0B, 0x18, 0x0D, 0x00, 0x05, 0x18, 0xA9,
++ 0x18, 0xA9, 0x00, 0x05, 0x19, 0x20, 0x19, 0x22, 0x00, 0x05, 0x19, 0x27, 0x19, 0x28, 0x00, 0x05,
++ 0x19, 0x32, 0x19, 0x32, 0x00, 0x05, 0x19, 0x39, 0x19, 0x3B, 0x00, 0x05, 0x1A, 0x17, 0x1A, 0x18,
++ 0x00, 0x05, 0x1B, 0x00, 0x1B, 0x03, 0x00, 0x05, 0x1B, 0x34, 0x1B, 0x34, 0x00, 0x05, 0x1B, 0x36,
++ 0x1B, 0x3A, 0x00, 0x05, 0x1B, 0x3C, 0x1B, 0x3C, 0x00, 0x05, 0x1B, 0x42, 0x1B, 0x42, 0x00, 0x05,
++ 0x1B, 0x6B, 0x1B, 0x73, 0x00, 0x05, 0x1B, 0x80, 0x1B, 0x81, 0x00, 0x05, 0x1B, 0xA2, 0x1B, 0xA5,
++ 0x00, 0x05, 0x1B, 0xA8, 0x1B, 0xA9, 0x00, 0x05, 0x1C, 0x2C, 0x1C, 0x33, 0x00, 0x05, 0x1C, 0x36,
++ 0x1C, 0x37, 0x00, 0x05, 0x1D, 0xC0, 0x1D, 0xE6, 0x00, 0x05, 0x1D, 0xFE, 0x1D, 0xFF, 0x00, 0x05,
++ 0x20, 0x0B, 0x20, 0x0B, 0x00, 0x05, 0x20, 0x0D, 0x20, 0x0D, 0x00, 0x01, 0x20, 0x0E, 0x20, 0x0F,
++ 0x00, 0x05, 0x20, 0x2A, 0x20, 0x2E, 0x00, 0x05, 0x20, 0x60, 0x20, 0x64, 0x00, 0x05, 0x20, 0x6A,
++ 0x20, 0x6F, 0x00, 0x05, 0x20, 0xD0, 0x20, 0xF0, 0x00, 0x05, 0x2D, 0xE0, 0x2D, 0xFF, 0x00, 0x05,
++ 0x30, 0x2A, 0x30, 0x2F, 0x00, 0x05, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x05, 0xA6, 0x6F, 0xA6, 0x72,
++ 0x00, 0x05, 0xA6, 0x7C, 0xA6, 0x7D, 0x00, 0x05, 0xA8, 0x02, 0xA8, 0x02, 0x00, 0x05, 0xA8, 0x06,
++ 0xA8, 0x06, 0x00, 0x05, 0xA8, 0x0B, 0xA8, 0x0B, 0x00, 0x05, 0xA8, 0x25, 0xA8, 0x26, 0x00, 0x05,
++ 0xA8, 0xC4, 0xA8, 0xC4, 0x00, 0x05, 0xA9, 0x26, 0xA9, 0x2D, 0x00, 0x05, 0xA9, 0x47, 0xA9, 0x51,
++ 0x00, 0x05, 0xAA, 0x29, 0xAA, 0x2E, 0x00, 0x05, 0xAA, 0x31, 0xAA, 0x32, 0x00, 0x05, 0xAA, 0x35,
++ 0xAA, 0x36, 0x00, 0x05, 0xAA, 0x43, 0xAA, 0x43, 0x00, 0x05, 0xAA, 0x4C, 0xAA, 0x4C, 0x00, 0x05,
++ 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x05, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x05, 0xFE, 0x20, 0xFE, 0x26,
++ 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x05
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.cpp b/src/share/native/sun/font/layout/SubstitutionLookups.cpp
+--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp
++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -53,18 +53,23 @@
+ le_uint16 substCount,
+ GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance,
+- le_int32 position)
++ le_int32 position,
++ LEErrorCode& success)
+ {
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
+ GlyphIterator tempIterator(*glyphIterator);
+
+- for (le_uint16 subst = 0; subst < substCount; subst += 1) {
++ for (le_uint16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) {
+ le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex);
+ le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex);
+
+ tempIterator.setCurrStreamPosition(position);
+ tempIterator.next(sequenceIndex);
+
+- lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance);
++ lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success);
+ }
+ }
+
+diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.h b/src/share/native/sun/font/layout/SubstitutionLookups.h
+--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.h
++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.h
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -60,7 +60,8 @@
+ le_uint16 substCount,
+ GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance,
+- le_int32 position);
++ le_int32 position,
++ LEErrorCode& success);
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp b/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -36,19 +36,24 @@
+ #include "ScriptAndLanguageTags.h"
+ #include "LEGlyphStorage.h"
+
++#include "KernTable.h"
++
+ #include "ThaiShaping.h"
+
+ U_NAMESPACE_BEGIN
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine)
+
+-ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
++ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success)
+ {
+ fErrorChar = 0x25CC;
+
+ // Figure out which presentation forms the font uses
+- if (fontInstance->canDisplay(0x0E64)) {
++ if (! fontInstance->canDisplay(0x0E01)) {
++ // No Thai in font; don't use presentation forms.
++ fGlyphSet = 3;
++ } else if (fontInstance->canDisplay(0x0E64)) {
+ // WorldType uses reserved space in Thai block
+ fGlyphSet = 0;
+ } else if (fontInstance->canDisplay(0xF701)) {
+@@ -116,4 +121,28 @@
+ return glyphCount;
+ }
+
++// This is the same as LayoutEngline::adjustGlyphPositions() except that it doesn't call adjustMarkGlyphs
++void ThaiLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
++{
++ if (LE_FAILURE(success)) {
++ return;
++ }
++
++ if (chars == NULL || offset < 0 || count < 0) {
++ success = LE_ILLEGAL_ARGUMENT_ERROR;
++ return;
++ }
++
++ if (fTypoFlags & 0x1) { /* kerning enabled */
++ static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
++
++ KernTable kt(fFontInstance, getFontTable(kernTableTag));
++ kt.process(glyphStorage);
++ }
++
++ // default is no adjustments
++ return;
++}
++
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.h b/src/share/native/sun/font/layout/ThaiLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ *
+ */
+
+@@ -62,13 +62,14 @@
+ * @param fontInstance - the font
+ * @param scriptCode - the script
+ * @param languageCode - the language
++ * @param success - set to an error code if the operation fails
+ *
+ * @see LEFontInstance
+ * @see ScriptAndLanguageTags.h for script and language codes
+ *
+ * @internal
+ */
+- ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags);
++ ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -139,6 +140,28 @@
+ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+ LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
++ /**
++ * This method does positioning adjustments like accent positioning and
++ * kerning. The default implementation does nothing. Subclasses needing
++ * position adjustments must override this method.
++ *
++ * Note that this method has both characters and glyphs as input so that
++ * it can use the character codes to determine glyph types if that information
++ * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF
++ * table)
++ *
++ * @param chars - the input character context
++ * @param offset - the offset of the first character to process
++ * @param count - the number of characters to process
++ * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered
++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be
++ * adjusted as needed.
++ * @param success - output parameter set to an error code if the operation fails
++ *
++ * @internal
++ */
++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp b/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp
+@@ -0,0 +1,112 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
++ *
++ * Developed at DIT - Government of Bhutan
++ *
++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt>
++ *
++ * This file is a modification of the ICU file KhmerReordering.cpp
++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan
++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding.
++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola
++ *
++ */
++
++
++#include "OpenTypeLayoutEngine.h"
++#include "TibetanLayoutEngine.h"
++#include "LEGlyphStorage.h"
++#include "TibetanReordering.h"
++
++U_NAMESPACE_BEGIN
++
++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine)
++
++TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
++{
++ fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount);
++ fFeatureOrder = TRUE;
++}
++
++TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, LEErrorCode &success)
++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success)
++{
++ fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount);
++ fFeatureOrder = TRUE;
++}
++
++TibetanOpenTypeLayoutEngine::~TibetanOpenTypeLayoutEngine()
++{
++ // nothing to do
++}
++
++// Input: characters
++// Output: characters, char indices, tags
++// Returns: output character count
++le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++{
++ if (LE_FAILURE(success)) {
++ return 0;
++ }
++
++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
++ success = LE_ILLEGAL_ARGUMENT_ERROR;
++ return 0;
++ }
++
++ le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough
++
++ outChars = LE_NEW_ARRAY(LEUnicode, worstCase);
++
++ if (outChars == NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
++
++ glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success);
++ glyphStorage.allocateAuxData(success);
++
++ if (LE_FAILURE(success)) {
++ LE_DELETE_ARRAY(outChars);
++ return 0;
++ }
++
++ // NOTE: assumes this allocates featureTags...
++ // (probably better than doing the worst case stuff here...)
++ le_int32 outCharCount = TibetanReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage);
++
++ glyphStorage.adoptGlyphCount(outCharCount);
++ return outCharCount;
++}
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.h b/src/share/native/sun/font/layout/TibetanLayoutEngine.h
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.h
+@@ -0,0 +1,156 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
++ *
++ * Developed at DIT - Government of Bhutan
++ *
++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt>
++ *
++ * This file is a modification of the ICU file KhmerReordering.cpp
++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan
++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding.
++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola
++ *
++ */
++
++#ifndef __TIBETANLAYOUTENGINE_H
++#define __TIBETANLAYOUTENGINE_H
++
++// #include "LETypes.h"
++// #include "LEFontInstance.h"
++// #include "LEGlyphFilter.h"
++// #include "LayoutEngine.h"
++// #include "OpenTypeLayoutEngine.h"
++
++// #include "GlyphSubstitutionTables.h"
++// #include "GlyphDefinitionTables.h"
++// #include "GlyphPositioningTables.h"
++
++U_NAMESPACE_BEGIN
++
++// class MPreFixups;
++// class LEGlyphStorage;
++
++/**
++ * This class implements OpenType layout for Dzongkha and Tibetan OpenType fonts
++ *
++ * @internal
++ */
++class TibetanOpenTypeLayoutEngine : public OpenTypeLayoutEngine
++{
++public:
++ /**
++ * This is the main constructor. It constructs an instance of TibetanOpenTypeLayoutEngine for
++ * a particular font, script and language. It takes the GSUB table as a parameter since
++ * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an
++ * Tibetan OpenType font.
++ *
++ * @param fontInstance - the font
++ * @param scriptCode - the script
++ * @param langaugeCode - the language
++ * @param gsubTable - the GSUB table
++ * @param success - set to an error code if the operation fails
++ *
++ * @see LayoutEngine::layoutEngineFactory
++ * @see OpenTypeLayoutEngine
++ * @see ScriptAndLangaugeTags.h for script and language codes
++ *
++ * @internal
++ */
++ TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++
++ /**
++ * This constructor is used when the font requires a "canned" GSUB table which can't be known
++ * until after this constructor has been invoked.
++ *
++ * @param fontInstance - the font
++ * @param scriptCode - the script
++ * @param langaugeCode - the language
++ * @param success - set to an error code if the operation fails
++ *
++ * @see OpenTypeLayoutEngine
++ * @see ScriptAndLangaugeTags.h for script and language codes
++ *
++ * @internal
++ */
++ TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ le_int32 typoFlags, LEErrorCode &success);
++
++ /**
++ * The destructor, virtual for correct polymorphic invocation.
++ *
++ * @internal
++ */
++ virtual ~TibetanOpenTypeLayoutEngine();
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for the actual class.
++ *
++ * @internal ICU 3.6
++ */
++ virtual UClassID getDynamicClassID() const;
++
++ /**
++ * ICU "poor man's RTTI", returns a UClassID for this class.
++ *
++ * @internal ICU 3.6
++ */
++ static UClassID getStaticClassID();
++
++protected:
++
++ /**
++ * This method does Tibetan OpenType character processing. It assigns the OpenType feature
++ * tags to the characters, and may generate output characters which have been reordered.
++ * It may also split some vowels, resulting in more output characters than input characters.
++ *
++ * Input parameters:
++ * @param chars - the input character context
++ * @param offset - the index of the first character to process
++ * @param count - the number of characters to process
++ * @param max - the number of characters in the input context
++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set.
++ * the auxillary data array will be set to the feature tags.
++ *
++ * Output parameters:
++ * @param success - set to an error code if the operation fails
++ *
++ * @return the output character count
++ *
++ * @internal
++ */
++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
++
++};
++
++U_NAMESPACE_END
++#endif
++
+diff --git a/src/share/native/sun/font/layout/TibetanReordering.cpp b/src/share/native/sun/font/layout/TibetanReordering.cpp
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/TibetanReordering.cpp
+@@ -0,0 +1,414 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
++ *
++ * Developed at DIT - Government of Bhutan
++ *
++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt>
++ *
++ * This file is a modification of the ICU file KhmerReordering.cpp
++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan
++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding.
++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola
++ *
++ */
++
++//#include <stdio.h>
++#include "LETypes.h"
++#include "OpenTypeTables.h"
++#include "TibetanReordering.h"
++#include "LEGlyphStorage.h"
++
++
++U_NAMESPACE_BEGIN
++
++// Characters that get refered to by name...
++enum
++{
++ C_DOTTED_CIRCLE = 0x25CC,
++ C_PRE_NUMBER_MARK = 0x0F3F
++ };
++
++
++enum
++{
++ // simple classes, they are used in the statetable (in this file) to control the length of a syllable
++ // they are also used to know where a character should be placed (location in reference to the base character)
++ // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to
++ // indicate error in syllable construction
++ _xx = TibetanClassTable::CC_RESERVED,
++ _ba = TibetanClassTable::CC_BASE,
++ _sj = TibetanClassTable::CC_SUBJOINED | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW,
++ _tp = TibetanClassTable::CC_TSA_PHRU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE,
++ _ac = TibetanClassTable::CC_A_CHUNG | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW,
++ _cs = TibetanClassTable::CC_COMP_SANSKRIT | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW,
++ _ha = TibetanClassTable::CC_HALANTA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW,
++ _bv = TibetanClassTable::CC_BELOW_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW,
++ _av = TibetanClassTable::CC_ABOVE_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE,
++ _an = TibetanClassTable::CC_ANUSVARA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE,
++ _cb = TibetanClassTable::CC_CANDRABINDU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE,
++ _vs = TibetanClassTable::CC_VISARGA | TibetanClassTable::CF_DOTTED_CIRCLE| TibetanClassTable::CF_POS_AFTER,
++ _as = TibetanClassTable::CC_ABOVE_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE,
++ _bs = TibetanClassTable::CC_BELOW_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW,
++ _di = TibetanClassTable::CC_DIGIT | TibetanClassTable::CF_DIGIT,
++ _pd = TibetanClassTable::CC_PRE_DIGIT_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_PREDIGIT | TibetanClassTable::CF_POS_BEFORE ,
++ _bd = TibetanClassTable::CC_POST_BELOW_DIGIT_M | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_AFTER
++};
++
++
++// Character class tables
++//_xx Non Combining characters
++//_ba Base Consonants
++//_sj Subjoined consonants
++//_tp Tsa - phru
++//_ac A-chung, Vowel Lengthening mark
++//_cs Precomposed Sanskrit vowel + subjoined consonants
++//_ha Halanta/Virama
++//_bv Below vowel
++//_av above vowel
++//_an Anusvara
++//_cb Candrabindu
++//_vs Visaraga/Post mark
++//_as Upper Stress marks
++//_bs Lower Stress marks
++//_di Digit
++//_pd Number pre combining, Needs reordering
++//_bd Other number combining marks
++
++static const TibetanClassTable::CharClass tibetanCharClasses[] =
++{
++ // 0 1 2 3 4 5 6 7 8 9 a b c d e f
++ _xx, _ba, _xx, _xx, _ba, _ba, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0F00 - 0F0F 0
++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _bd, _bd, _xx, _xx, _xx, _xx, _xx, _xx, // 0F10 - 0F1F 1
++ _di, _di, _di, _di, _di, _di, _di, _di, _di, _di, _xx, _xx, _xx, _xx, _xx, _xx, // 0F20 - 0F2F 2
++ _xx, _xx, _xx, _xx, _xx, _bs, _xx, _bs, _xx, _tp, _xx, _xx, _xx, _xx, _bd, _pd, // 0F30 - 0F3F 3
++ _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F40 - 0F4F 4
++ _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F50 - 0F5F 5
++ _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, _xx, // 0F60 - 0F6F 6
++ _xx, _ac, _av, _cs, _bv, _bv, _cs, _cs, _cs, _cs, _av, _av, _av, _av, _an, _vs, // 0F70 - 0F7F 7
++ _av, _cs, _cb, _cb, _ha, _xx, _as, _as, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, // 0F80 - 0F8F 8
++ _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0F90 - 0F9F 9
++ _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0FA0 - 0FAF a
++ _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, // 0FB0 - 0FBF b
++ _xx, _xx, _xx, _xx, _xx, _xx, _bs, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FC0 - 0FCF c
++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx,// 0FD0 - 0FDF d
++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FE0 - 0FEF e
++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FF0 - 0FFF f
++};
++
++
++//
++// Tibetan Class Tables
++//
++
++//
++// The range of characters defined in the above table is defined here. For Tibetan 0F00 to 0FFF
++// Even if the Tibetan range is bigger, most of the characters are not combinable, and therefore treated
++// as _xx
++static const TibetanClassTable tibetanClassTable = {0x0F00, 0x0FFF, tibetanCharClasses};
++
++
++// Below we define how a character in the input string is either in the tibetanCharClasses table
++// (in which case we get its type back), or an unknown object in which case we get _xx (CC_RESERVED) back
++TibetanClassTable::CharClass TibetanClassTable::getCharClass(LEUnicode ch) const
++{
++ if (ch < firstChar || ch > lastChar) {
++ return CC_RESERVED;
++ }
++
++ return classTable[ch - firstChar];
++}
++
++const TibetanClassTable *TibetanClassTable::getTibetanClassTable()
++{
++ return &tibetanClassTable;
++}
++
++
++
++class TibetanReorderingOutput : public UMemory {
++private:
++ le_int32 fSyllableCount;
++ le_int32 fOutIndex;
++ LEUnicode *fOutChars;
++
++ LEGlyphStorage &fGlyphStorage;
++
++
++public:
++ TibetanReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage)
++ : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
++ {
++ // nothing else to do...
++ }
++
++ ~TibetanReorderingOutput()
++ {
++ // nothing to do here...
++ }
++
++ void reset()
++ {
++ fSyllableCount += 1;
++ }
++
++ void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask featureMask)
++ {
++ LEErrorCode success = LE_NO_ERROR;
++
++ fOutChars[fOutIndex] = ch;
++
++ fGlyphStorage.setCharIndex(fOutIndex, charIndex, success);
++ fGlyphStorage.setAuxData(fOutIndex, featureMask, success);
++
++ fOutIndex += 1;
++ }
++
++ le_int32 getOutputIndex()
++ {
++ return fOutIndex;
++ }
++};
++
++
++//TODO remove unused flags
++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG
++#define blwfFeatureTag LE_BLWF_FEATURE_TAG
++#define pstfFeatureTag LE_PSTF_FEATURE_TAG
++#define presFeatureTag LE_PRES_FEATURE_TAG
++#define blwsFeatureTag LE_BLWS_FEATURE_TAG
++#define abvsFeatureTag LE_ABVS_FEATURE_TAG
++#define pstsFeatureTag LE_PSTS_FEATURE_TAG
++
++#define blwmFeatureTag LE_BLWM_FEATURE_TAG
++#define abvmFeatureTag LE_ABVM_FEATURE_TAG
++#define distFeatureTag LE_DIST_FEATURE_TAG
++
++#define prefFeatureTag LE_PREF_FEATURE_TAG
++#define abvfFeatureTag LE_ABVF_FEATURE_TAG
++#define cligFeatureTag LE_CLIG_FEATURE_TAG
++#define mkmkFeatureTag LE_MKMK_FEATURE_TAG
++
++// Shaping features
++#define prefFeatureMask 0x80000000UL
++#define blwfFeatureMask 0x40000000UL
++#define abvfFeatureMask 0x20000000UL
++#define pstfFeatureMask 0x10000000UL
++#define presFeatureMask 0x08000000UL
++#define blwsFeatureMask 0x04000000UL
++#define abvsFeatureMask 0x02000000UL
++#define pstsFeatureMask 0x01000000UL
++#define cligFeatureMask 0x00800000UL
++#define ccmpFeatureMask 0x00040000UL
++
++// Positioning features
++#define distFeatureMask 0x00400000UL
++#define blwmFeatureMask 0x00200000UL
++#define abvmFeatureMask 0x00100000UL
++#define mkmkFeatureMask 0x00080000UL
++
++#define tagPref (ccmpFeatureMask | prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask)
++#define tagAbvf (ccmpFeatureMask | abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask)
++#define tagPstf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask)
++#define tagBlwf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask)
++#define tagDefault (ccmpFeatureMask | prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask)
++
++
++
++// These are in the order in which the features need to be applied
++// for correct processing
++static const FeatureMap featureMap[] =
++{
++ // Shaping features
++ {ccmpFeatureTag, ccmpFeatureMask},
++ {prefFeatureTag, prefFeatureMask},
++ {blwfFeatureTag, blwfFeatureMask},
++ {abvfFeatureTag, abvfFeatureMask},
++ {pstfFeatureTag, pstfFeatureMask},
++ {presFeatureTag, presFeatureMask},
++ {blwsFeatureTag, blwsFeatureMask},
++ {abvsFeatureTag, abvsFeatureMask},
++ {pstsFeatureTag, pstsFeatureMask},
++ {cligFeatureTag, cligFeatureMask},
++
++ // Positioning features
++ {distFeatureTag, distFeatureMask},
++ {blwmFeatureTag, blwmFeatureMask},
++ {abvmFeatureTag, abvmFeatureMask},
++ {mkmkFeatureTag, mkmkFeatureMask},
++};
++
++static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap);
++
++// The stateTable is used to calculate the end (the length) of a well
++// formed Tibetan Syllable.
++//
++// Each horizontal line is ordered exactly the same way as the values in TibetanClassTable
++// CharClassValues in TibetanReordering.h This coincidence of values allows the
++// follow up of the table.
++//
++// Each line corresponds to a state, which does not necessarily need to be a type
++// of component... for example, state 2 is a base, with is always a first character
++// in the syllable, but the state could be produced a consonant of any type when
++// it is the first character that is analysed (in ground state).
++//
++static const le_int8 tibetanStateTable[][TibetanClassTable::CC_COUNT] =
++{
++
++
++ //Dzongkha state table
++ //xx ba sj tp ac cs ha bv av an cb vs as bs di pd bd
++ { 1, 2, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, 20, 21, 21,}, // 0 - ground state
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 1 - exit state (or sign to the right of the syllable)
++ {-1, -1, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 2 - Base consonant
++ {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 3 - Tsa phru after base
++ {-1, -1, 4, 6, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 4 - Subjoined consonant after base
++ {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 5 - Subjoined consonant after tsa phru
++ {-1, -1, -1, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 6 - Tsa phru after subjoined consonant
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 7 - Pre Composed Sanskrit
++ {-1, -1, -1, -1, -1, -1, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 8 - A-chung
++ {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, -1, 19, 19, -1, -1, -1,}, // 9 - Halanta
++ {-1, -1, -1, -1, -1, -1, -1, 11, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 10 - below vowel 1
++ {-1, -1, -1, -1, -1, -1, -1, 12, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 11 - below vowel 2
++ {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 12 - below vowel 3
++ {-1, -1, -1, -1, -1, -1, -1, -1, 14, 17, 17, 18, 19, 19, -1, -1, -1,}, // 13 - Anusvara before vowel
++ {-1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 17, 18, 19, 19, -1, -1, -1,}, // 14 - above vowel 1
++ {-1, -1, -1, -1, -1, -1, -1, -1, 16, 17, 17, 18, 19, 19, -1, -1, -1,}, // 15 - above vowel 2
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 17, 18, 19, 19, -1, -1, -1,}, // 16 - above vowel 3
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 19, -1, -1, -1,}, // 17 - Anusvara or Candrabindu after vowel
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 18 - Visarga
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 19 - strss mark
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 21,}, // 20 - digit
++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 21 - digit mark
++
++
++};
++
++
++const FeatureMap *TibetanReordering::getFeatureMap(le_int32 &count)
++{
++ count = featureMapCount;
++
++ return featureMap;
++}
++
++
++// Given an input string of characters and a location in which to start looking
++// calculate, using the state table, which one is the last character of the syllable
++// that starts in the starting position.
++le_int32 TibetanReordering::findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount)
++{
++ le_int32 cursor = prev;
++ le_int8 state = 0;
++
++ while (cursor < charCount) {
++ TibetanClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & TibetanClassTable::CF_CLASS_MASK);
++
++ state = tibetanStateTable[state][charClass];
++
++ if (state < 0) {
++ break;
++ }
++
++ cursor += 1;
++ }
++
++ return cursor;
++}
++
++
++// This is the real reordering function as applied to the Tibetan language
++
++le_int32 TibetanReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage)
++{
++ const TibetanClassTable *classTable = TibetanClassTable::getTibetanClassTable();
++
++ TibetanReorderingOutput output(outChars, glyphStorage);
++ TibetanClassTable::CharClass charClass;
++ le_int32 i, prev = 0;
++
++ // This loop only exits when we reach the end of a run, which may contain
++ // several syllables.
++ while (prev < charCount) {
++ le_int32 syllable = findSyllable(classTable, chars, prev, charCount);
++
++ output.reset();
++
++ // shall we add a dotted circle?
++ // If in the position in which the base should be (first char in the string) there is
++ // a character that has the Dotted circle flag (a character that cannot be a base)
++ // then write a dotted circle
++ if (classTable->getCharClass(chars[prev]) & TibetanClassTable::CF_DOTTED_CIRCLE) {
++ output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault);
++ }
++
++ // copy the rest to output, inverting the pre-number mark if present after a digit.
++ for (i = prev; i < syllable; i += 1) {
++ charClass = classTable->getCharClass(chars[i]);
++
++ if ((TibetanClassTable::CF_DIGIT & charClass)
++ && ( classTable->getCharClass(chars[i+1]) & TibetanClassTable::CF_PREDIGIT))
++ {
++ output.writeChar(C_PRE_NUMBER_MARK, i, tagPref);
++ output.writeChar(chars[i], i+1 , tagPref);
++ i += 1;
++ } else {
++ switch (charClass & TibetanClassTable::CF_POS_MASK) {
++
++ // If the present character is a number, and the next character is a pre-number combining mark
++ // then the two characters are reordered
++
++ case TibetanClassTable::CF_POS_ABOVE :
++ output.writeChar(chars[i], i, tagAbvf);
++ break;
++
++ case TibetanClassTable::CF_POS_AFTER :
++ output.writeChar(chars[i], i, tagPstf);
++ break;
++
++ case TibetanClassTable::CF_POS_BELOW :
++ output.writeChar(chars[i], i, tagBlwf);
++ break;
++
++ default:
++ // default - any other characters
++ output.writeChar(chars[i], i, tagDefault);
++ break;
++ } // switch
++ } // if
++ } // for
++
++ prev = syllable; // move the pointer to the start of next syllable
++ }
++
++ return output.getOutputIndex();
++}
++
++
++U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/TibetanReordering.h b/src/share/native/sun/font/layout/TibetanReordering.h
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/TibetanReordering.h
+@@ -0,0 +1,176 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ *
++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
++ *
++ * Developed at DIT - Government of Bhutan
++ *
++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt>
++ *
++ * This file is a modification of the ICU file KhmerReordering.h
++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan
++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding.
++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola
++ *
++ */
++
++#ifndef __TIBETANREORDERING_H
++#define __TIBETANORDERING_H
++
++/**
++ * \file
++ * \internal
++ */
++
++// #include "LETypes.h"
++// #include "OpenTypeTables.h"
++
++U_NAMESPACE_BEGIN
++
++class LEGlyphStorage;
++
++// Vocabulary
++// Base -> A consonant in its full (not subscript) form. It is the
++// center of the syllable, it can be souranded by subjoined consonants, vowels,
++// signs... but there is only one base in a stack, it has to be coded as
++// the first character of the syllable.Included here are also groups of base + subjoined
++// which are represented by one single code point in unicode (e.g. 0F43) Also other characters that might take
++// subjoined consonants or other combining characters.
++// Subjoined -> Subjoined consonants and groups of subjoined consonants which have a single code-point
++// to repersent the group (even if each subjoined consonant is represented independently
++// by anothe code-point
++// Tsa Phru --> Tsa Phru character, Bhutanese people will always place it right after the base, but sometimes, due to
++// "normalization"
++// is placed after all the subjoined consonants, and it is also permitted there.
++// A Chung Vowel lengthening mark --> . 0F71 It is placed after the base and any subjoined consonants but before any vowels
++// Precomposed Sanskrit vowels --> The are combinations of subjoined consonants + vowels that have been assigned
++// a given code-point (in spite of each single part of them having also a code-point
++// They are avoided, and users are encouraged to use the combination of code-points that
++// represents the same sound instead of using this combined characters. This is included here
++// for compatibility with possible texts that use them (they are not in the Dzongkha keyboard).
++// Halanta -> The Halanta or Virama character 0F84 indicates that a consonant should not use its inheernt vowel,
++// in spite of not having other vowels present. It is usually placed immediatly after a base consonant,
++// but in some special cases it can also be placed after a subjoined consonant, so this is also
++// permitted in this algorithm. (Halanta is always displayed in Tibetan not used as a connecting char)
++//
++// Subjoined vowels -> Dependent vowels (matras) placed below the base and below all subjoined consonants. There
++// might be as much as three subjoined vowels in a given stack (only one in general text, but up
++// to three for abreviations, they have to be permitted).
++// Superscript vowels -> There are three superscript vowels, and they can be repeated or combined (up to three
++// times. They can combine with subjoined vowels, and are always coded after these.
++// Anusvara --> Nasalisation sign. Traditioinally placed in absence of vowels, but also after vowels. In some
++// special cases it can be placed before a vowel, so this is also permitted
++// Candrabindu -> Forms of the Anusvara with different glyphs (and different in identity) which can be placed
++// without vowel or after the vowel, but never before. Cannot combine with Anusvara.
++// Stress marks -> Marks placed above or below a syllable, affecting the whole syllable. They are combining
++// marks, so they have to be attached to a specific stack. The are using to emphasise a syllable.
++//
++// Digits -> Digits are not considered as non-combining characters because there are a few characters which
++// combine with them, so they have to be considered independently.
++// Digit combining marks -> dependent marks that combine with digits.
++//
++// TODO
++// There are a number of characters in the CJK block that are used in Tibetan script, two of these are symbols
++// are used as bases for combining glyphs, and have not been encoded in Tibetan. As these characters are outside
++// of the tibetan block, they have not been treated in this program.
++
++
++struct TibetanClassTable // This list must include all types of components that can be used inside a syllable
++{
++ enum CharClassValues // order is important here! This order must be the same that is found in each horizontal
++ // line in the statetable for Tibetan (file TibetanReordering.cpp). It assigns one number
++ // to each type of character that has to be considered when analysing the order in which
++ // characters can be placed
++ {
++ CC_RESERVED = 0, //Non Combining Characters
++ CC_BASE = 1, // Base Consonants, Base Consonants with Subjoined attached in code point, Sanskrit base marks
++ CC_SUBJOINED = 2, // Subjoined Consonats, combination of more than Subjoined Consonants in the code point
++ CC_TSA_PHRU = 3, // Tsa-Phru character 0F39
++ CC_A_CHUNG = 4, // Vowel Lenthening a-chung mark 0F71
++ CC_COMP_SANSKRIT = 5, // Precomposed Sanskrit vowels including Subjoined characters and vowels
++ CC_HALANTA = 6, // Halanta Character 0F84
++ CC_BELOW_VOWEL = 7, // Subjoined vowels
++ CC_ABOVE_VOWEL = 8, // Superscript vowels
++ CC_ANUSVARA = 9, // Tibetan sign Rjes Su Nga Ro 0F7E
++ CC_CANDRABINDU = 10, // Tibetan sign Sna Ldan and Nyi Zla Naa Da 0F82, 0F83
++ CC_VISARGA = 11, // Tibetan sign Rnam Bcad (0F7F)
++ CC_ABOVE_S_MARK = 12, // Stress Marks placed above the text
++ CC_BELOW_S_MARK = 13, // Stress Marks placed below the text
++ CC_DIGIT = 14, // Dzongkha Digits
++ CC_PRE_DIGIT_MARK = 15, // Mark placed before the digit
++ CC_POST_BELOW_DIGIT_M = 16, // Mark placed below or after the digit
++ CC_COUNT = 17 // This is the number of character classes
++ };
++
++ enum CharClassFlags
++ {
++ CF_CLASS_MASK = 0x0000FFFF,
++
++ CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable
++ CF_DIGIT = 0x01000000, // flag to speed up comparaisson
++ CF_PREDIGIT = 0x02000000, // flag to detect pre-digit marks for reordering
++
++ // position flags
++ CF_POS_BEFORE = 0x00080000,
++ CF_POS_BELOW = 0x00040000,
++ CF_POS_ABOVE = 0x00020000,
++ CF_POS_AFTER = 0x00010000,
++ CF_POS_MASK = 0x000f0000
++ };
++
++ typedef le_uint32 CharClass;
++
++ typedef le_int32 ScriptFlags;
++
++ LEUnicode firstChar; // for Tibetan this will become xOF00
++ LEUnicode lastChar; // and this x0FFF
++ const CharClass *classTable;
++
++ CharClass getCharClass(LEUnicode ch) const;
++
++ static const TibetanClassTable *getTibetanClassTable();
++};
++
++
++class TibetanReordering /* not : public UObject because all methods are static */ {
++public:
++ static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode,
++ LEUnicode *outChars, LEGlyphStorage &glyphStorage);
++
++ static const FeatureMap *getFeatureMap(le_int32 &count);
++
++private:
++ // do not instantiate
++ TibetanReordering();
++
++ static le_int32 findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount);
++
++};
++
++
++U_NAMESPACE_END
++#endif
+diff --git a/test/java/awt/font/TextLayout/TestOldHangul.java b/test/java/awt/font/TextLayout/TestOldHangul.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/awt/font/TextLayout/TestOldHangul.java
+@@ -0,0 +1,83 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/* @test @(#)TestOldHangul.java
++ * @summary Verify Old Hangul display
++ * @bug 6886358
++ * @ignore Requires a special font installed.
++ */
++
++import javax.swing.*;
++import javax.swing.border.LineBorder;
++import java.awt.*;
++import java.awt.event.ActionEvent;
++
++public class TestOldHangul {
++ public static void main(String[] args) {
++ SwingUtilities.invokeLater(new Runnable() {
++ public void run() {
++ new TestOldHangul().run();
++ }
++ });
++ }
++ public static boolean AUTOMATIC_TEST=true; // true; run test automatically, else manually at button push
++
++ private void run() {
++ Font ourFont = null;
++ final String fontName = "UnBatangOdal.ttf"; // download from http://chem.skku.ac.kr/~wkpark/project/font/GSUB/UnbatangOdal/ and place in {user.home}/fonts/
++ try {
++ ourFont = Font.createFont(Font.TRUETYPE_FONT, new java.io.File(new java.io.File(System.getProperty("user.home"),"fonts"), fontName));
++ ourFont = ourFont.deriveFont((float)48.0);
++ } catch(Throwable t) {
++ t.printStackTrace();
++ System.err.println("Fail: " + t);
++ return;
++ }
++ JFrame frame = new JFrame(System.getProperty("java.version"));
++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
++ JPanel panel = new JPanel();
++ final JTextArea label = new JTextArea("(empty)");
++ label.setSize(400, 300);
++ label.setBorder(new LineBorder(Color.black));
++ label.setFont(ourFont);
++ final String str = "\u110A\u119E\u11B7\u0020\u1112\u119E\u11AB\uAE00\u0020\u1100\u119E\u11F9\u0020\u112B\u119E\u11BC\n";
++
++ if(AUTOMATIC_TEST) { /* run the test automatically (else, manually) */
++ label.setText(str);
++ } else {
++ JButton button = new JButton("Old Hangul");
++ button.addActionListener(new AbstractAction() {
++ public void actionPerformed(ActionEvent actionEvent) {
++ label.setText(str);
++ }
++ });
++ panel.add(button);
++ }
++ panel.add(label);
++
++ frame.getContentPane().add(panel);
++ frame.pack();
++ frame.setVisible(true);
++ }
++}
++
+diff --git a/test/java/awt/font/TextLayout/TestTibetan.java b/test/java/awt/font/TextLayout/TestTibetan.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/awt/font/TextLayout/TestTibetan.java
+@@ -0,0 +1,87 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/* @test @(#)TestTibetan.java
++ * @summary verify tibetan output
++ * @bug 6886358
++ * @ignore Requires a special font installed
++ */
++
++import javax.swing.*;
++import javax.swing.border.LineBorder;
++import java.awt.*;
++import java.awt.event.ActionEvent;
++
++public class TestTibetan {
++ public static void main(String[] args) {
++ SwingUtilities.invokeLater(new Runnable() {
++ public void run() {
++ new TestTibetan().run();
++ }
++ });
++ }
++ public static boolean AUTOMATIC_TEST=true; // true; run test automatically, else manually at button push
++
++ private void run() {
++ Font ourFont = null;
++ try {
++ //For best results: Font from: http://download.savannah.gnu.org/releases/free-tibetan/jomolhari/
++ // place in $(user.home)/fonts/
++ ourFont = Font.createFont(Font.TRUETYPE_FONT, new java.io.File(new java.io.File(System.getProperty("user.home"),"fonts"), "Jomolhari-alpha3c-0605331.ttf"));
++
++ //ourFont = new Font("serif",Font.PLAIN, 24);
++ ourFont = ourFont.deriveFont((float)24.0);
++ } catch(Throwable t) {
++ t.printStackTrace();
++ System.err.println("Fail: " + t);
++ return;
++ }
++ JFrame frame = new JFrame(System.getProperty("java.version"));
++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
++ JPanel panel = new JPanel();
++ final JTextArea label = new JTextArea("(empty)");
++ label.setSize(400, 300);
++ label.setBorder(new LineBorder(Color.black));
++ label.setFont(ourFont);
++
++ final String str = "\u0F04\u0F05\u0F0D\u0F0D\u0020\u0F4F\u0F72\u0F53\u0F0B\u0F4F\u0F72\u0F53\u0F0B\u0F42\u0FB1\u0F72\u0F0B\u0F51\u0F54\u0F60\u0F0B\u0F62\u0FA9\u0F63"; // TinTin.
++
++ if(AUTOMATIC_TEST) { /* run the test automatically (else, manually) */
++ label.setText(str);
++ } else {
++ JButton button = new JButton("Set Char x0DDD");
++ button.addActionListener(new AbstractAction() {
++ public void actionPerformed(ActionEvent actionEvent) {
++ label.setText(str);
++ }
++ });
++ panel.add(button);
++ }
++ panel.add(label);
++
++ frame.getContentPane().add(panel);
++ frame.pack();
++ frame.setVisible(true);
++ }
++}
++
diff --git a/java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch b/java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch
new file mode 100644
index 000000000000..50e4c6d7d67a
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch
@@ -0,0 +1,42 @@
+# HG changeset patch
+# User andrew
+# Date 1365711839 -3600
+# Node ID df591e0dfd349dc5986cc17949939c588d5a9690
+# Parent 06255d9f82761abc74c30f31fda00968ffef4bc3
+6963811: Deadlock-prone locking changes in Introspector
+Reviewed-by: peterz, rupashka
+
+diff --git a/src/share/classes/java/beans/Introspector.java b/src/share/classes/java/beans/Introspector.java
+--- jdk/src/share/classes/java/beans/Introspector.java
++++ jdk/src/share/classes/java/beans/Introspector.java
+@@ -170,21 +170,24 @@
+ if (!ReflectUtil.isPackageAccessible(beanClass)) {
+ return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
+ }
++ WeakCache<Class<?>, BeanInfo> beanInfoCache;
++ BeanInfo beanInfo;
+ synchronized (BEANINFO_CACHE) {
+- WeakCache<Class<?>, BeanInfo> beanInfoCache =
+- (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
++ beanInfoCache = (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
+
+ if (beanInfoCache == null) {
+ beanInfoCache = new WeakCache<Class<?>, BeanInfo>();
+ AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache);
+ }
+- BeanInfo beanInfo = beanInfoCache.get(beanClass);
+- if (beanInfo == null) {
+- beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
++ beanInfo = beanInfoCache.get(beanClass);
++ }
++ if (beanInfo == null) {
++ beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
++ synchronized (BEANINFO_CACHE) {
+ beanInfoCache.put(beanClass, beanInfo);
+ }
+- return beanInfo;
+ }
++ return beanInfo;
+ }
+
+ /**
diff --git a/java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch b/java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch
new file mode 100644
index 000000000000..1794154c83e3
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch
@@ -0,0 +1,101 @@
+# HG changeset patch
+# User andrew
+# Date 1365745184 -3600
+# Node ID 5ed9acc1f6be298713f10ad71c33564d48f46555
+# Parent d79bfc0c6371d1174209585a8d2bf08e3f3625f9
+7017324: Kerning crash in JDK 7 since ICU layout update
+Reviewed-by: igor, prr
+
+diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp
+--- jdk/src/share/native/sun/font/layout/KernTable.cpp
++++ jdk/src/share/native/sun/font/layout/KernTable.cpp
+@@ -217,7 +217,7 @@
+ // all the elements ahead of time and store them in the font
+
+ const PairInfo* p = pairsSwapped;
+- const PairInfo* tp = (const PairInfo*)(p + rangeShift);
++ const PairInfo* tp = (const PairInfo*)(p + (rangeShift/KERN_PAIRINFO_SIZE)); /* rangeshift is in original table bytes */
+ if (key > tp->key) {
+ p = tp;
+ }
+@@ -229,7 +229,7 @@
+ le_uint32 probe = searchRange;
+ while (probe > 1) {
+ probe >>= 1;
+- tp = (const PairInfo*)(p + probe);
++ tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE));
+ le_uint32 tkey = tp->key;
+ #if DEBUG
+ fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey);
+diff --git a/test/java/awt/font/TextLayout/KernCrash.java b/test/java/awt/font/TextLayout/KernCrash.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/awt/font/TextLayout/KernCrash.java
+@@ -0,0 +1,67 @@
++/*
++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++import java.io.*;
++import java.awt.*;
++import java.awt.font.*;
++import java.util.*;
++
++/**
++ * Shows (top) with kerning, (middle) without, (bottom) also without.
++ *
++ * @bug 7017324
++ */
++public class KernCrash extends Frame {
++ private static Font font0;
++ private static Font font1;
++ private static Font font2;
++
++ public static void main(String[] args) throws Exception {
++ HashMap attrs = new HashMap();
++ font0 = Font.createFont(Font.TRUETYPE_FONT, new File("Vera.ttf"));
++ System.out.println("using " + font0);
++ attrs.put(TextAttribute.SIZE, new Float(58f));
++ font1 = font0.deriveFont(attrs);
++ attrs.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
++ font2 = font0.deriveFont(attrs);
++
++ KernCrash f = new KernCrash();
++ f.setTitle("Kerning Crash");
++ f.setSize(600, 300);
++ f.setForeground(Color.black);
++ f.show();
++ }
++
++ public void paint(Graphics g) {
++ Graphics2D g2 = (Graphics2D)g;
++ FontRenderContext frc = g2.getFontRenderContext();
++ TextLayout layout = new TextLayout("text", font2, frc);
++ layout.draw(g2, 10, 150);
++
++ String s = "WAVATastic";
++ TextLayout layout2 = new TextLayout(s, font1, frc);
++ layout2.draw(g2, 10, 200);
++ TextLayout layout3 = new TextLayout(s, font2, frc);
++ layout3.draw(g2, 10, 100);
++ }
++}
diff --git a/java/openjdk6/files/icedtea/7032388-work_without_cmov_instruction.patch b/java/openjdk6/files/icedtea/openjdk/7032388-work_without_cmov_instruction.patch
index 532ad68b9565..532ad68b9565 100644
--- a/java/openjdk6/files/icedtea/7032388-work_without_cmov_instruction.patch
+++ b/java/openjdk6/files/icedtea/openjdk/7032388-work_without_cmov_instruction.patch
diff --git a/java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch b/java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch
new file mode 100644
index 000000000000..f710737912ef
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch
@@ -0,0 +1,1436 @@
+# HG changeset patch
+# User dl
+# Date 1303139440 -3600
+# Node ID 005c0c85b0decf18a90ff6c9601d1b9a2c0a3fa4
+# Parent 603e70836e74e5c18fc32279f7e4df5b4c63e0b6
+7036559: ConcurrentHashMap footprint and contention improvements
+Reviewed-by: chegar
+
+diff --git a/src/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/share/classes/java/util/concurrent/ConcurrentHashMap.java
+--- jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java
++++ jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java
+@@ -105,7 +105,25 @@
+
+ /*
+ * The basic strategy is to subdivide the table among Segments,
+- * each of which itself is a concurrently readable hash table.
++ * each of which itself is a concurrently readable hash table. To
++ * reduce footprint, all but one segments are constructed only
++ * when first needed (see ensureSegment). To maintain visibility
++ * in the presence of lazy construction, accesses to segments as
++ * well as elements of segment's table must use volatile access,
++ * which is done via Unsafe within methods segmentAt etc
++ * below. These provide the functionality of AtomicReferenceArrays
++ * but reduce the levels of indirection. Additionally,
++ * volatile-writes of table elements and entry "next" fields
++ * within locked operations use the cheaper "lazySet" forms of
++ * writes (via putOrderedObject) because these writes are always
++ * followed by lock releases that maintain sequential consistency
++ * of table updates.
++ *
++ * Historical note: The previous version of this class relied
++ * heavily on "final" fields, which avoided some volatile reads at
++ * the expense of a large initial footprint. Some remnants of
++ * that design (including forced construction of segment 0) exist
++ * to ensure serialization compatibility.
+ */
+
+ /* ---------------- Constants -------------- */
+@@ -137,8 +155,15 @@
+ static final int MAXIMUM_CAPACITY = 1 << 30;
+
+ /**
++ * The minimum capacity for per-segment tables. Must be a power
++ * of two, at least two to avoid immediate resizing on next use
++ * after lazy construction.
++ */
++ static final int MIN_SEGMENT_TABLE_CAPACITY = 2;
++
++ /**
+ * The maximum number of segments to allow; used to bound
+- * constructor arguments.
++ * constructor arguments. Must be power of two less than 1 << 24.
+ */
+ static final int MAX_SEGMENTS = 1 << 16; // slightly conservative
+
+@@ -164,7 +189,7 @@
+ final int segmentShift;
+
+ /**
+- * The segments, each of which is a specialized hash table
++ * The segments, each of which is a specialized hash table.
+ */
+ final Segment<K,V>[] segments;
+
+@@ -172,7 +197,65 @@
+ transient Set<Map.Entry<K,V>> entrySet;
+ transient Collection<V> values;
+
+- /* ---------------- Small Utilities -------------- */
++ /**
++ * ConcurrentHashMap list entry. Note that this is never exported
++ * out as a user-visible Map.Entry.
++ */
++ static final class HashEntry<K,V> {
++ final int hash;
++ final K key;
++ volatile V value;
++ volatile HashEntry<K,V> next;
++
++ HashEntry(int hash, K key, V value, HashEntry<K,V> next) {
++ this.hash = hash;
++ this.key = key;
++ this.value = value;
++ this.next = next;
++ }
++
++ /**
++ * Sets next field with volatile write semantics. (See above
++ * about use of putOrderedObject.)
++ */
++ final void setNext(HashEntry<K,V> n) {
++ UNSAFE.putOrderedObject(this, nextOffset, n);
++ }
++
++ // Unsafe mechanics
++ static final sun.misc.Unsafe UNSAFE;
++ static final long nextOffset;
++ static {
++ try {
++ UNSAFE = sun.misc.Unsafe.getUnsafe();
++ Class k = HashEntry.class;
++ nextOffset = UNSAFE.objectFieldOffset
++ (k.getDeclaredField("next"));
++ } catch (Exception e) {
++ throw new Error(e);
++ }
++ }
++ }
++
++ /**
++ * Gets the ith element of given table (if nonnull) with volatile
++ * read semantics.
++ */
++ @SuppressWarnings("unchecked")
++ static final <K,V> HashEntry<K,V> entryAt(HashEntry<K,V>[] tab, int i) {
++ return (tab == null) ? null :
++ (HashEntry<K,V>) UNSAFE.getObjectVolatile
++ (tab, ((long)i << TSHIFT) + TBASE);
++ }
++
++ /**
++ * Sets the ith element of given table, with volatile write
++ * semantics. (See above about use of putOrderedObject.)
++ */
++ static final <K,V> void setEntryAt(HashEntry<K,V>[] tab, int i,
++ HashEntry<K,V> e) {
++ UNSAFE.putOrderedObject(tab, ((long)i << TSHIFT) + TBASE, e);
++ }
+
+ /**
+ * Applies a supplemental hash function to a given hashCode, which
+@@ -193,104 +276,67 @@
+ }
+
+ /**
+- * Returns the segment that should be used for key with given hash
+- * @param hash the hash code for the key
+- * @return the segment
+- */
+- final Segment<K,V> segmentFor(int hash) {
+- return segments[(hash >>> segmentShift) & segmentMask];
+- }
+-
+- /* ---------------- Inner Classes -------------- */
+-
+- /**
+- * ConcurrentHashMap list entry. Note that this is never exported
+- * out as a user-visible Map.Entry.
+- *
+- * Because the value field is volatile, not final, it is legal wrt
+- * the Java Memory Model for an unsynchronized reader to see null
+- * instead of initial value when read via a data race. Although a
+- * reordering leading to this is not likely to ever actually
+- * occur, the Segment.readValueUnderLock method is used as a
+- * backup in case a null (pre-initialized) value is ever seen in
+- * an unsynchronized access method.
+- */
+- static final class HashEntry<K,V> {
+- final K key;
+- final int hash;
+- volatile V value;
+- final HashEntry<K,V> next;
+-
+- HashEntry(K key, int hash, HashEntry<K,V> next, V value) {
+- this.key = key;
+- this.hash = hash;
+- this.next = next;
+- this.value = value;
+- }
+-
+- @SuppressWarnings("unchecked")
+- static final <K,V> HashEntry<K,V>[] newArray(int i) {
+- return new HashEntry[i];
+- }
+- }
+-
+- /**
+ * Segments are specialized versions of hash tables. This
+ * subclasses from ReentrantLock opportunistically, just to
+ * simplify some locking and avoid separate construction.
+ */
+ static final class Segment<K,V> extends ReentrantLock implements Serializable {
+ /*
+- * Segments maintain a table of entry lists that are ALWAYS
+- * kept in a consistent state, so can be read without locking.
+- * Next fields of nodes are immutable (final). All list
+- * additions are performed at the front of each bin. This
+- * makes it easy to check changes, and also fast to traverse.
+- * When nodes would otherwise be changed, new nodes are
+- * created to replace them. This works well for hash tables
+- * since the bin lists tend to be short. (The average length
+- * is less than two for the default load factor threshold.)
++ * Segments maintain a table of entry lists that are always
++ * kept in a consistent state, so can be read (via volatile
++ * reads of segments and tables) without locking. This
++ * requires replicating nodes when necessary during table
++ * resizing, so the old lists can be traversed by readers
++ * still using old version of table.
+ *
+- * Read operations can thus proceed without locking, but rely
+- * on selected uses of volatiles to ensure that completed
+- * write operations performed by other threads are
+- * noticed. For most purposes, the "count" field, tracking the
+- * number of elements, serves as that volatile variable
+- * ensuring visibility. This is convenient because this field
+- * needs to be read in many read operations anyway:
+- *
+- * - All (unsynchronized) read operations must first read the
+- * "count" field, and should not look at table entries if
+- * it is 0.
+- *
+- * - All (synchronized) write operations should write to
+- * the "count" field after structurally changing any bin.
+- * The operations must not take any action that could even
+- * momentarily cause a concurrent read operation to see
+- * inconsistent data. This is made easier by the nature of
+- * the read operations in Map. For example, no operation
+- * can reveal that the table has grown but the threshold
+- * has not yet been updated, so there are no atomicity
+- * requirements for this with respect to reads.
+- *
+- * As a guide, all critical volatile reads and writes to the
+- * count field are marked in code comments.
++ * This class defines only mutative methods requiring locking.
++ * Except as noted, the methods of this class perform the
++ * per-segment versions of ConcurrentHashMap methods. (Other
++ * methods are integrated directly into ConcurrentHashMap
++ * methods.) These mutative methods use a form of controlled
++ * spinning on contention via methods scanAndLock and
++ * scanAndLockForPut. These intersperse tryLocks with
++ * traversals to locate nodes. The main benefit is to absorb
++ * cache misses (which are very common for hash tables) while
++ * obtaining locks so that traversal is faster once
++ * acquired. We do not actually use the found nodes since they
++ * must be re-acquired under lock anyway to ensure sequential
++ * consistency of updates (and in any case may be undetectably
++ * stale), but they will normally be much faster to re-locate.
++ * Also, scanAndLockForPut speculatively creates a fresh node
++ * to use in put if no node is found.
+ */
+
+ private static final long serialVersionUID = 2249069246763182397L;
+
+ /**
+- * The number of elements in this segment's region.
++ * The maximum number of times to tryLock in a prescan before
++ * possibly blocking on acquire in preparation for a locked
++ * segment operation. On multiprocessors, using a bounded
++ * number of retries maintains cache acquired while locating
++ * nodes.
+ */
+- transient volatile int count;
++ static final int MAX_SCAN_RETRIES =
++ Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1;
+
+ /**
+- * Number of updates that alter the size of the table. This is
+- * used during bulk-read methods to make sure they see a
+- * consistent snapshot: If modCounts change during a traversal
+- * of segments computing size or checking containsValue, then
+- * we might have an inconsistent view of state so (usually)
+- * must retry.
++ * The per-segment table. Elements are accessed via
++ * entryAt/setEntryAt providing volatile semantics.
++ */
++ transient volatile HashEntry<K,V>[] table;
++
++ /**
++ * The number of elements. Accessed only either within locks
++ * or among other volatile reads that maintain visibility.
++ */
++ transient int count;
++
++ /**
++ * The total number of mutative operations in this segment.
++ * Even though this may overflows 32 bits, it provides
++ * sufficient accuracy for stability checks in CHM isEmpty()
++ * and size() methods. Accessed only either within locks or
++ * among other volatile reads that maintain visibility.
+ */
+ transient int modCount;
+
+@@ -302,11 +348,6 @@
+ transient int threshold;
+
+ /**
+- * The per-segment table.
+- */
+- transient volatile HashEntry<K,V>[] table;
+-
+- /**
+ * The load factor for the hash table. Even though this value
+ * is same for all segments, it is replicated to avoid needing
+ * links to outer object.
+@@ -314,202 +355,94 @@
+ */
+ final float loadFactor;
+
+- Segment(int initialCapacity, float lf) {
+- loadFactor = lf;
+- setTable(HashEntry.<K,V>newArray(initialCapacity));
++ Segment(float lf, int threshold, HashEntry<K,V>[] tab) {
++ this.loadFactor = lf;
++ this.threshold = threshold;
++ this.table = tab;
+ }
+
+- @SuppressWarnings("unchecked")
+- static final <K,V> Segment<K,V>[] newArray(int i) {
+- return new Segment[i];
++ final V put(K key, int hash, V value, boolean onlyIfAbsent) {
++ HashEntry<K,V> node = tryLock() ? null :
++ scanAndLockForPut(key, hash, value);
++ V oldValue;
++ try {
++ HashEntry<K,V>[] tab = table;
++ int index = (tab.length - 1) & hash;
++ HashEntry<K,V> first = entryAt(tab, index);
++ for (HashEntry<K,V> e = first;;) {
++ if (e != null) {
++ K k;
++ if ((k = e.key) == key ||
++ (e.hash == hash && key.equals(k))) {
++ oldValue = e.value;
++ if (!onlyIfAbsent) {
++ e.value = value;
++ ++modCount;
++ }
++ break;
++ }
++ e = e.next;
++ }
++ else {
++ if (node != null)
++ node.setNext(first);
++ else
++ node = new HashEntry<K,V>(hash, key, value, first);
++ int c = count + 1;
++ if (c > threshold && first != null &&
++ tab.length < MAXIMUM_CAPACITY)
++ rehash(node);
++ else
++ setEntryAt(tab, index, node);
++ ++modCount;
++ count = c;
++ oldValue = null;
++ break;
++ }
++ }
++ } finally {
++ unlock();
++ }
++ return oldValue;
+ }
+
+ /**
+- * Sets table to new HashEntry array.
+- * Call only while holding lock or in constructor.
++ * Doubles size of table and repacks entries, also adding the
++ * given node to new table
+ */
+- void setTable(HashEntry<K,V>[] newTable) {
+- threshold = (int)(newTable.length * loadFactor);
+- table = newTable;
+- }
+-
+- /**
+- * Returns properly casted first entry of bin for given hash.
+- */
+- HashEntry<K,V> getFirst(int hash) {
+- HashEntry<K,V>[] tab = table;
+- return tab[hash & (tab.length - 1)];
+- }
+-
+- /**
+- * Reads value field of an entry under lock. Called if value
+- * field ever appears to be null. This is possible only if a
+- * compiler happens to reorder a HashEntry initialization with
+- * its table assignment, which is legal under memory model
+- * but is not known to ever occur.
+- */
+- V readValueUnderLock(HashEntry<K,V> e) {
+- lock();
+- try {
+- return e.value;
+- } finally {
+- unlock();
+- }
+- }
+-
+- /* Specialized implementations of map methods */
+-
+- V get(Object key, int hash) {
+- if (count != 0) { // read-volatile
+- HashEntry<K,V> e = getFirst(hash);
+- while (e != null) {
+- if (e.hash == hash && key.equals(e.key)) {
+- V v = e.value;
+- if (v != null)
+- return v;
+- return readValueUnderLock(e); // recheck
+- }
+- e = e.next;
+- }
+- }
+- return null;
+- }
+-
+- boolean containsKey(Object key, int hash) {
+- if (count != 0) { // read-volatile
+- HashEntry<K,V> e = getFirst(hash);
+- while (e != null) {
+- if (e.hash == hash && key.equals(e.key))
+- return true;
+- e = e.next;
+- }
+- }
+- return false;
+- }
+-
+- boolean containsValue(Object value) {
+- if (count != 0) { // read-volatile
+- HashEntry<K,V>[] tab = table;
+- int len = tab.length;
+- for (int i = 0 ; i < len; i++) {
+- for (HashEntry<K,V> e = tab[i]; e != null; e = e.next) {
+- V v = e.value;
+- if (v == null) // recheck
+- v = readValueUnderLock(e);
+- if (value.equals(v))
+- return true;
+- }
+- }
+- }
+- return false;
+- }
+-
+- boolean replace(K key, int hash, V oldValue, V newValue) {
+- lock();
+- try {
+- HashEntry<K,V> e = getFirst(hash);
+- while (e != null && (e.hash != hash || !key.equals(e.key)))
+- e = e.next;
+-
+- boolean replaced = false;
+- if (e != null && oldValue.equals(e.value)) {
+- replaced = true;
+- e.value = newValue;
+- }
+- return replaced;
+- } finally {
+- unlock();
+- }
+- }
+-
+- V replace(K key, int hash, V newValue) {
+- lock();
+- try {
+- HashEntry<K,V> e = getFirst(hash);
+- while (e != null && (e.hash != hash || !key.equals(e.key)))
+- e = e.next;
+-
+- V oldValue = null;
+- if (e != null) {
+- oldValue = e.value;
+- e.value = newValue;
+- }
+- return oldValue;
+- } finally {
+- unlock();
+- }
+- }
+-
+-
+- V put(K key, int hash, V value, boolean onlyIfAbsent) {
+- lock();
+- try {
+- int c = count;
+- if (c++ > threshold) // ensure capacity
+- rehash();
+- HashEntry<K,V>[] tab = table;
+- int index = hash & (tab.length - 1);
+- HashEntry<K,V> first = tab[index];
+- HashEntry<K,V> e = first;
+- while (e != null && (e.hash != hash || !key.equals(e.key)))
+- e = e.next;
+-
+- V oldValue;
+- if (e != null) {
+- oldValue = e.value;
+- if (!onlyIfAbsent)
+- e.value = value;
+- }
+- else {
+- oldValue = null;
+- ++modCount;
+- tab[index] = new HashEntry<K,V>(key, hash, first, value);
+- count = c; // write-volatile
+- }
+- return oldValue;
+- } finally {
+- unlock();
+- }
+- }
+-
+- void rehash() {
++ @SuppressWarnings("unchecked")
++ private void rehash(HashEntry<K,V> node) {
++ /*
++ * Reclassify nodes in each list to new table. Because we
++ * are using power-of-two expansion, the elements from
++ * each bin must either stay at same index, or move with a
++ * power of two offset. We eliminate unnecessary node
++ * creation by catching cases where old nodes can be
++ * reused because their next fields won't change.
++ * Statistically, at the default threshold, only about
++ * one-sixth of them need cloning when a table
++ * doubles. The nodes they replace will be garbage
++ * collectable as soon as they are no longer referenced by
++ * any reader thread that may be in the midst of
++ * concurrently traversing table. Entry accesses use plain
++ * array indexing because they are followed by volatile
++ * table write.
++ */
+ HashEntry<K,V>[] oldTable = table;
+ int oldCapacity = oldTable.length;
+- if (oldCapacity >= MAXIMUM_CAPACITY)
+- return;
+-
+- /*
+- * Reclassify nodes in each list to new Map. Because we are
+- * using power-of-two expansion, the elements from each bin
+- * must either stay at same index, or move with a power of two
+- * offset. We eliminate unnecessary node creation by catching
+- * cases where old nodes can be reused because their next
+- * fields won't change. Statistically, at the default
+- * threshold, only about one-sixth of them need cloning when
+- * a table doubles. The nodes they replace will be garbage
+- * collectable as soon as they are no longer referenced by any
+- * reader thread that may be in the midst of traversing table
+- * right now.
+- */
+-
+- HashEntry<K,V>[] newTable = HashEntry.newArray(oldCapacity<<1);
+- threshold = (int)(newTable.length * loadFactor);
+- int sizeMask = newTable.length - 1;
++ int newCapacity = oldCapacity << 1;
++ threshold = (int)(newCapacity * loadFactor);
++ HashEntry<K,V>[] newTable =
++ (HashEntry<K,V>[]) new HashEntry[newCapacity];
++ int sizeMask = newCapacity - 1;
+ for (int i = 0; i < oldCapacity ; i++) {
+- // We need to guarantee that any existing reads of old Map can
+- // proceed. So we cannot yet null out each bin.
+ HashEntry<K,V> e = oldTable[i];
+-
+ if (e != null) {
+ HashEntry<K,V> next = e.next;
+ int idx = e.hash & sizeMask;
+-
+- // Single node on list
+- if (next == null)
++ if (next == null) // Single node on list
+ newTable[idx] = e;
+-
+- else {
+- // Reuse trailing consecutive sequence at same slot
++ else { // Reuse consecutive sequence at same slot
+ HashEntry<K,V> lastRun = e;
+ int lastIdx = idx;
+ for (HashEntry<K,V> last = next;
+@@ -522,74 +455,259 @@
+ }
+ }
+ newTable[lastIdx] = lastRun;
+-
+- // Clone all remaining nodes
++ // Clone remaining nodes
+ for (HashEntry<K,V> p = e; p != lastRun; p = p.next) {
+- int k = p.hash & sizeMask;
++ V v = p.value;
++ int h = p.hash;
++ int k = h & sizeMask;
+ HashEntry<K,V> n = newTable[k];
+- newTable[k] = new HashEntry<K,V>(p.key, p.hash,
+- n, p.value);
++ newTable[k] = new HashEntry<K,V>(h, p.key, v, n);
+ }
+ }
+ }
+ }
++ int nodeIndex = node.hash & sizeMask; // add the new node
++ node.setNext(newTable[nodeIndex]);
++ newTable[nodeIndex] = node;
+ table = newTable;
+ }
+
+ /**
++ * Scans for a node containing given key while trying to
++ * acquire lock, creating and returning one if not found. Upon
++ * return, guarantees that lock is held. UNlike in most
++ * methods, calls to method equals are not screened: Since
++ * traversal speed doesn't matter, we might as well help warm
++ * up the associated code and accesses as well.
++ *
++ * @return a new node if key not found, else null
++ */
++ private HashEntry<K,V> scanAndLockForPut(K key, int hash, V value) {
++ HashEntry<K,V> first = entryForHash(this, hash);
++ HashEntry<K,V> e = first;
++ HashEntry<K,V> node = null;
++ int retries = -1; // negative while locating node
++ while (!tryLock()) {
++ HashEntry<K,V> f; // to recheck first below
++ if (retries < 0) {
++ if (e == null) {
++ if (node == null) // speculatively create node
++ node = new HashEntry<K,V>(hash, key, value, null);
++ retries = 0;
++ }
++ else if (key.equals(e.key))
++ retries = 0;
++ else
++ e = e.next;
++ }
++ else if (++retries > MAX_SCAN_RETRIES) {
++ lock();
++ break;
++ }
++ else if ((retries & 1) == 0 &&
++ (f = entryForHash(this, hash)) != first) {
++ e = first = f; // re-traverse if entry changed
++ retries = -1;
++ }
++ }
++ return node;
++ }
++
++ /**
++ * Scans for a node containing the given key while trying to
++ * acquire lock for a remove or replace operation. Upon
++ * return, guarantees that lock is held. Note that we must
++ * lock even if the key is not found, to ensure sequential
++ * consistency of updates.
++ */
++ private void scanAndLock(Object key, int hash) {
++ // similar to but simpler than scanAndLockForPut
++ HashEntry<K,V> first = entryForHash(this, hash);
++ HashEntry<K,V> e = first;
++ int retries = -1;
++ while (!tryLock()) {
++ HashEntry<K,V> f;
++ if (retries < 0) {
++ if (e == null || key.equals(e.key))
++ retries = 0;
++ else
++ e = e.next;
++ }
++ else if (++retries > MAX_SCAN_RETRIES) {
++ lock();
++ break;
++ }
++ else if ((retries & 1) == 0 &&
++ (f = entryForHash(this, hash)) != first) {
++ e = first = f;
++ retries = -1;
++ }
++ }
++ }
++
++ /**
+ * Remove; match on key only if value null, else match both.
+ */
+- V remove(Object key, int hash, Object value) {
++ final V remove(Object key, int hash, Object value) {
++ if (!tryLock())
++ scanAndLock(key, hash);
++ V oldValue = null;
++ try {
++ HashEntry<K,V>[] tab = table;
++ int index = (tab.length - 1) & hash;
++ HashEntry<K,V> e = entryAt(tab, index);
++ HashEntry<K,V> pred = null;
++ while (e != null) {
++ K k;
++ HashEntry<K,V> next = e.next;
++ if ((k = e.key) == key ||
++ (e.hash == hash && key.equals(k))) {
++ V v = e.value;
++ if (value == null || value == v || value.equals(v)) {
++ if (pred == null)
++ setEntryAt(tab, index, next);
++ else
++ pred.setNext(next);
++ ++modCount;
++ --count;
++ oldValue = v;
++ }
++ break;
++ }
++ pred = e;
++ e = next;
++ }
++ } finally {
++ unlock();
++ }
++ return oldValue;
++ }
++
++ final boolean replace(K key, int hash, V oldValue, V newValue) {
++ if (!tryLock())
++ scanAndLock(key, hash);
++ boolean replaced = false;
++ try {
++ HashEntry<K,V> e;
++ for (e = entryForHash(this, hash); e != null; e = e.next) {
++ K k;
++ if ((k = e.key) == key ||
++ (e.hash == hash && key.equals(k))) {
++ if (oldValue.equals(e.value)) {
++ e.value = newValue;
++ ++modCount;
++ replaced = true;
++ }
++ break;
++ }
++ }
++ } finally {
++ unlock();
++ }
++ return replaced;
++ }
++
++ final V replace(K key, int hash, V value) {
++ if (!tryLock())
++ scanAndLock(key, hash);
++ V oldValue = null;
++ try {
++ HashEntry<K,V> e;
++ for (e = entryForHash(this, hash); e != null; e = e.next) {
++ K k;
++ if ((k = e.key) == key ||
++ (e.hash == hash && key.equals(k))) {
++ oldValue = e.value;
++ e.value = value;
++ ++modCount;
++ break;
++ }
++ }
++ } finally {
++ unlock();
++ }
++ return oldValue;
++ }
++
++ final void clear() {
+ lock();
+ try {
+- int c = count - 1;
+ HashEntry<K,V>[] tab = table;
+- int index = hash & (tab.length - 1);
+- HashEntry<K,V> first = tab[index];
+- HashEntry<K,V> e = first;
+- while (e != null && (e.hash != hash || !key.equals(e.key)))
+- e = e.next;
+-
+- V oldValue = null;
+- if (e != null) {
+- V v = e.value;
+- if (value == null || value.equals(v)) {
+- oldValue = v;
+- // All entries following removed node can stay
+- // in list, but all preceding ones need to be
+- // cloned.
+- ++modCount;
+- HashEntry<K,V> newFirst = e.next;
+- for (HashEntry<K,V> p = first; p != e; p = p.next)
+- newFirst = new HashEntry<K,V>(p.key, p.hash,
+- newFirst, p.value);
+- tab[index] = newFirst;
+- count = c; // write-volatile
+- }
+- }
+- return oldValue;
++ for (int i = 0; i < tab.length ; i++)
++ setEntryAt(tab, i, null);
++ ++modCount;
++ count = 0;
+ } finally {
+ unlock();
+ }
+ }
++ }
+
+- void clear() {
+- if (count != 0) {
+- lock();
+- try {
+- HashEntry<K,V>[] tab = table;
+- for (int i = 0; i < tab.length ; i++)
+- tab[i] = null;
+- ++modCount;
+- count = 0; // write-volatile
+- } finally {
+- unlock();
++ // Accessing segments
++
++ /**
++ * Gets the jth element of given segment array (if nonnull) with
++ * volatile element access semantics via Unsafe.
++ */
++ @SuppressWarnings("unchecked")
++ static final <K,V> Segment<K,V> segmentAt(Segment<K,V>[] ss, int j) {
++ long u = (j << SSHIFT) + SBASE;
++ return ss == null ? null :
++ (Segment<K,V>) UNSAFE.getObjectVolatile(ss, u);
++ }
++
++ /**
++ * Returns the segment for the given index, creating it and
++ * recording in segment table (via CAS) if not already present.
++ *
++ * @param k the index
++ * @return the segment
++ */
++ @SuppressWarnings("unchecked")
++ private Segment<K,V> ensureSegment(int k) {
++ final Segment<K,V>[] ss = this.segments;
++ long u = (k << SSHIFT) + SBASE; // raw offset
++ Segment<K,V> seg;
++ if ((seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u)) == null) {
++ Segment<K,V> proto = ss[0]; // use segment 0 as prototype
++ int cap = proto.table.length;
++ float lf = proto.loadFactor;
++ int threshold = (int)(cap * lf);
++ HashEntry<K,V>[] tab = (HashEntry<K,V>[])new HashEntry[cap];
++ if ((seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u))
++ == null) { // recheck
++ Segment<K,V> s = new Segment<K,V>(lf, threshold, tab);
++ while ((seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u))
++ == null) {
++ if (UNSAFE.compareAndSwapObject(ss, u, null, seg = s))
++ break;
+ }
+ }
+ }
++ return seg;
+ }
+
++ // Hash-based segment and entry accesses
+
++ /**
++ * Get the segment for the given hash
++ */
++ @SuppressWarnings("unchecked")
++ private Segment<K,V> segmentForHash(int h) {
++ long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;
++ return (Segment<K,V>) UNSAFE.getObjectVolatile(segments, u);
++ }
++
++ /**
++ * Gets the table entry for the given segment and hash
++ */
++ @SuppressWarnings("unchecked")
++ static final <K,V> HashEntry<K,V> entryForHash(Segment<K,V> seg, int h) {
++ HashEntry<K,V>[] tab;
++ return (seg == null || (tab = seg.table) == null) ? null :
++ (HashEntry<K,V>) UNSAFE.getObjectVolatile
++ (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE);
++ }
+
+ /* ---------------- Public operations -------------- */
+
+@@ -609,14 +727,13 @@
+ * negative or the load factor or concurrencyLevel are
+ * nonpositive.
+ */
++ @SuppressWarnings("unchecked")
+ public ConcurrentHashMap(int initialCapacity,
+ float loadFactor, int concurrencyLevel) {
+ if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
+ throw new IllegalArgumentException();
+-
+ if (concurrencyLevel > MAX_SEGMENTS)
+ concurrencyLevel = MAX_SEGMENTS;
+-
+ // Find power-of-two sizes best matching arguments
+ int sshift = 0;
+ int ssize = 1;
+@@ -624,21 +741,23 @@
+ ++sshift;
+ ssize <<= 1;
+ }
+- segmentShift = 32 - sshift;
+- segmentMask = ssize - 1;
+- this.segments = Segment.newArray(ssize);
+-
++ this.segmentShift = 32 - sshift;
++ this.segmentMask = ssize - 1;
+ if (initialCapacity > MAXIMUM_CAPACITY)
+ initialCapacity = MAXIMUM_CAPACITY;
+ int c = initialCapacity / ssize;
+ if (c * ssize < initialCapacity)
+ ++c;
+- int cap = 1;
++ int cap = MIN_SEGMENT_TABLE_CAPACITY;
+ while (cap < c)
+ cap <<= 1;
+-
+- for (int i = 0; i < this.segments.length; ++i)
+- this.segments[i] = new Segment<K,V>(cap, loadFactor);
++ // create segments and segments[0]
++ Segment<K,V> s0 =
++ new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
++ (HashEntry<K,V>[])new HashEntry[cap]);
++ Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
++ UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
++ this.segments = ss;
+ }
+
+ /**
+@@ -701,33 +820,36 @@
+ * @return <tt>true</tt> if this map contains no key-value mappings
+ */
+ public boolean isEmpty() {
++ /*
++ * Sum per-segment modCounts to avoid mis-reporting when
++ * elements are concurrently added and removed in one segment
++ * while checking another, in which case the table was never
++ * actually empty at any point. (The sum ensures accuracy up
++ * through at least 1<<31 per-segment modifications before
++ * recheck.) Methods size() and containsValue() use similar
++ * constructions for stability checks.
++ */
++ long sum = 0L;
+ final Segment<K,V>[] segments = this.segments;
+- /*
+- * We keep track of per-segment modCounts to avoid ABA
+- * problems in which an element in one segment was added and
+- * in another removed during traversal, in which case the
+- * table was never actually empty at any point. Note the
+- * similar use of modCounts in the size() and containsValue()
+- * methods, which are the only other methods also susceptible
+- * to ABA problems.
+- */
+- int[] mc = new int[segments.length];
+- int mcsum = 0;
+- for (int i = 0; i < segments.length; ++i) {
+- if (segments[i].count != 0)
++ for (int j = 0; j < segments.length; ++j) {
++ Segment<K,V> seg = segmentAt(segments, j);
++ if (seg != null) {
++ if (seg.count != 0)
++ return false;
++ sum += seg.modCount;
++ }
++ }
++ if (sum != 0L) { // recheck unless no modifications
++ for (int j = 0; j < segments.length; ++j) {
++ Segment<K,V> seg = segmentAt(segments, j);
++ if (seg != null) {
++ if (seg.count != 0)
++ return false;
++ sum -= seg.modCount;
++ }
++ }
++ if (sum != 0L)
+ return false;
+- else
+- mcsum += mc[i] = segments[i].modCount;
+- }
+- // If mcsum happens to be zero, then we know we got a snapshot
+- // before any modifications at all were made. This is
+- // probably common enough to bother tracking.
+- if (mcsum != 0) {
+- for (int i = 0; i < segments.length; ++i) {
+- if (segments[i].count != 0 ||
+- mc[i] != segments[i].modCount)
+- return false;
+- }
+ }
+ return true;
+ }
+@@ -740,45 +862,43 @@
+ * @return the number of key-value mappings in this map
+ */
+ public int size() {
+- final Segment<K,V>[] segments = this.segments;
+- long sum = 0;
+- long check = 0;
+- int[] mc = new int[segments.length];
+ // Try a few times to get accurate count. On failure due to
+ // continuous async changes in table, resort to locking.
+- for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {
+- check = 0;
+- sum = 0;
+- int mcsum = 0;
+- for (int i = 0; i < segments.length; ++i) {
+- sum += segments[i].count;
+- mcsum += mc[i] = segments[i].modCount;
+- }
+- if (mcsum != 0) {
+- for (int i = 0; i < segments.length; ++i) {
+- check += segments[i].count;
+- if (mc[i] != segments[i].modCount) {
+- check = -1; // force retry
+- break;
++ final Segment<K,V>[] segments = this.segments;
++ int size;
++ boolean overflow; // true if size overflows 32 bits
++ long sum; // sum of modCounts
++ long last = 0L; // previous sum
++ int retries = -1; // first iteration isn't retry
++ try {
++ for (;;) {
++ if (retries++ == RETRIES_BEFORE_LOCK) {
++ for (int j = 0; j < segments.length; ++j)
++ ensureSegment(j).lock(); // force creation
++ }
++ sum = 0L;
++ size = 0;
++ overflow = false;
++ for (int j = 0; j < segments.length; ++j) {
++ Segment<K,V> seg = segmentAt(segments, j);
++ if (seg != null) {
++ sum += seg.modCount;
++ int c = seg.count;
++ if (c < 0 || (size += c) < 0)
++ overflow = true;
+ }
+ }
++ if (sum == last)
++ break;
++ last = sum;
+ }
+- if (check == sum)
+- break;
++ } finally {
++ if (retries > RETRIES_BEFORE_LOCK) {
++ for (int j = 0; j < segments.length; ++j)
++ segmentAt(segments, j).unlock();
++ }
+ }
+- if (check != sum) { // Resort to locking all segments
+- sum = 0;
+- for (int i = 0; i < segments.length; ++i)
+- segments[i].lock();
+- for (int i = 0; i < segments.length; ++i)
+- sum += segments[i].count;
+- for (int i = 0; i < segments.length; ++i)
+- segments[i].unlock();
+- }
+- if (sum > Integer.MAX_VALUE)
+- return Integer.MAX_VALUE;
+- else
+- return (int)sum;
++ return overflow ? Integer.MAX_VALUE : size;
+ }
+
+ /**
+@@ -794,7 +914,13 @@
+ */
+ public V get(Object key) {
+ int hash = hash(key.hashCode());
+- return segmentFor(hash).get(key, hash);
++ for (HashEntry<K,V> e = entryForHash(segmentForHash(hash), hash);
++ e != null; e = e.next) {
++ K k;
++ if ((k = e.key) == key || (e.hash == hash && key.equals(k)))
++ return e.value;
++ }
++ return null;
+ }
+
+ /**
+@@ -808,7 +934,13 @@
+ */
+ public boolean containsKey(Object key) {
+ int hash = hash(key.hashCode());
+- return segmentFor(hash).containsKey(key, hash);
++ for (HashEntry<K,V> e = entryForHash(segmentForHash(hash), hash);
++ e != null; e = e.next) {
++ K k;
++ if ((k = e.key) == key || (e.hash == hash && key.equals(k)))
++ return true;
++ }
++ return false;
+ }
+
+ /**
+@@ -823,51 +955,47 @@
+ * @throws NullPointerException if the specified value is null
+ */
+ public boolean containsValue(Object value) {
++ // Same idea as size()
+ if (value == null)
+ throw new NullPointerException();
+-
+- // See explanation of modCount use above
+-
+ final Segment<K,V>[] segments = this.segments;
+- int[] mc = new int[segments.length];
+-
+- // Try a few times without locking
+- for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {
+- int sum = 0;
+- int mcsum = 0;
+- for (int i = 0; i < segments.length; ++i) {
+- int c = segments[i].count;
+- mcsum += mc[i] = segments[i].modCount;
+- if (segments[i].containsValue(value))
+- return true;
+- }
+- boolean cleanSweep = true;
+- if (mcsum != 0) {
+- for (int i = 0; i < segments.length; ++i) {
+- int c = segments[i].count;
+- if (mc[i] != segments[i].modCount) {
+- cleanSweep = false;
+- break;
++ boolean found = false;
++ long last = 0;
++ int retries = -1;
++ try {
++ outer: for (;;) {
++ if (retries++ == RETRIES_BEFORE_LOCK) {
++ for (int j = 0; j < segments.length; ++j)
++ ensureSegment(j).lock(); // force creation
++ }
++ long hashSum = 0L;
++ int sum = 0;
++ for (int j = 0; j < segments.length; ++j) {
++ HashEntry<K,V>[] tab;
++ Segment<K,V> seg = segmentAt(segments, j);
++ if (seg != null && (tab = seg.table) != null) {
++ for (int i = 0 ; i < tab.length; i++) {
++ HashEntry<K,V> e;
++ for (e = entryAt(tab, i); e != null; e = e.next) {
++ V v = e.value;
++ if (v != null && value.equals(v)) {
++ found = true;
++ break outer;
++ }
++ }
++ }
++ sum += seg.modCount;
+ }
+ }
+- }
+- if (cleanSweep)
+- return false;
+- }
+- // Resort to locking all segments
+- for (int i = 0; i < segments.length; ++i)
+- segments[i].lock();
+- boolean found = false;
+- try {
+- for (int i = 0; i < segments.length; ++i) {
+- if (segments[i].containsValue(value)) {
+- found = true;
++ if (retries > 0 && sum == last)
+ break;
+- }
++ last = sum;
+ }
+ } finally {
+- for (int i = 0; i < segments.length; ++i)
+- segments[i].unlock();
++ if (retries > RETRIES_BEFORE_LOCK) {
++ for (int j = 0; j < segments.length; ++j)
++ segmentAt(segments, j).unlock();
++ }
+ }
+ return found;
+ }
+@@ -908,7 +1036,11 @@
+ if (value == null)
+ throw new NullPointerException();
+ int hash = hash(key.hashCode());
+- return segmentFor(hash).put(key, hash, value, false);
++ int j = (hash >>> segmentShift) & segmentMask;
++ Segment<K,V> s = segmentAt(segments, j);
++ if (s == null)
++ s = ensureSegment(j);
++ return s.put(key, hash, value, false);
+ }
+
+ /**
+@@ -922,7 +1054,11 @@
+ if (value == null)
+ throw new NullPointerException();
+ int hash = hash(key.hashCode());
+- return segmentFor(hash).put(key, hash, value, true);
++ int j = (hash >>> segmentShift) & segmentMask;
++ Segment<K,V> s = segmentAt(segments, j);
++ if (s == null)
++ s = ensureSegment(j);
++ return s.put(key, hash, value, true);
+ }
+
+ /**
+@@ -948,7 +1084,8 @@
+ */
+ public V remove(Object key) {
+ int hash = hash(key.hashCode());
+- return segmentFor(hash).remove(key, hash, null);
++ Segment<K,V> s = segmentForHash(hash);
++ return s == null ? null : s.remove(key, hash, null);
+ }
+
+ /**
+@@ -958,9 +1095,9 @@
+ */
+ public boolean remove(Object key, Object value) {
+ int hash = hash(key.hashCode());
+- if (value == null)
+- return false;
+- return segmentFor(hash).remove(key, hash, value) != null;
++ Segment<K,V> s;
++ return value != null && (s = segmentForHash(hash)) != null &&
++ s.remove(key, hash, value) != null;
+ }
+
+ /**
+@@ -969,10 +1106,11 @@
+ * @throws NullPointerException if any of the arguments are null
+ */
+ public boolean replace(K key, V oldValue, V newValue) {
++ int hash = hash(key.hashCode());
+ if (oldValue == null || newValue == null)
+ throw new NullPointerException();
+- int hash = hash(key.hashCode());
+- return segmentFor(hash).replace(key, hash, oldValue, newValue);
++ Segment<K,V> s = segmentForHash(hash);
++ return s != null && s.replace(key, hash, oldValue, newValue);
+ }
+
+ /**
+@@ -983,18 +1121,23 @@
+ * @throws NullPointerException if the specified key or value is null
+ */
+ public V replace(K key, V value) {
++ int hash = hash(key.hashCode());
+ if (value == null)
+ throw new NullPointerException();
+- int hash = hash(key.hashCode());
+- return segmentFor(hash).replace(key, hash, value);
++ Segment<K,V> s = segmentForHash(hash);
++ return s == null ? null : s.replace(key, hash, value);
+ }
+
+ /**
+ * Removes all of the mappings from this map.
+ */
+ public void clear() {
+- for (int i = 0; i < segments.length; ++i)
+- segments[i].clear();
++ final Segment<K,V>[] segments = this.segments;
++ for (int j = 0; j < segments.length; ++j) {
++ Segment<K,V> s = segmentAt(segments, j);
++ if (s != null)
++ s.clear();
++ }
+ }
+
+ /**
+@@ -1095,42 +1238,41 @@
+ advance();
+ }
+
+- public boolean hasMoreElements() { return hasNext(); }
+-
++ /**
++ * Set nextEntry to first node of next non-empty table
++ * (in backwards order, to simplify checks).
++ */
+ final void advance() {
+- if (nextEntry != null && (nextEntry = nextEntry.next) != null)
+- return;
+-
+- while (nextTableIndex >= 0) {
+- if ( (nextEntry = currentTable[nextTableIndex--]) != null)
+- return;
+- }
+-
+- while (nextSegmentIndex >= 0) {
+- Segment<K,V> seg = segments[nextSegmentIndex--];
+- if (seg.count != 0) {
+- currentTable = seg.table;
+- for (int j = currentTable.length - 1; j >= 0; --j) {
+- if ( (nextEntry = currentTable[j]) != null) {
+- nextTableIndex = j - 1;
+- return;
+- }
+- }
++ for (;;) {
++ if (nextTableIndex >= 0) {
++ if ((nextEntry = entryAt(currentTable,
++ nextTableIndex--)) != null)
++ break;
+ }
++ else if (nextSegmentIndex >= 0) {
++ Segment<K,V> seg = segmentAt(segments, nextSegmentIndex--);
++ if (seg != null && (currentTable = seg.table) != null)
++ nextTableIndex = currentTable.length - 1;
++ }
++ else
++ break;
+ }
+ }
+
+- public boolean hasNext() { return nextEntry != null; }
+-
+- HashEntry<K,V> nextEntry() {
+- if (nextEntry == null)
++ final HashEntry<K,V> nextEntry() {
++ HashEntry<K,V> e = nextEntry;
++ if (e == null)
+ throw new NoSuchElementException();
+- lastReturned = nextEntry;
+- advance();
+- return lastReturned;
++ lastReturned = e; // cannot assign until after null check
++ if ((nextEntry = e.next) == null)
++ advance();
++ return e;
+ }
+
+- public void remove() {
++ public final boolean hasNext() { return nextEntry != null; }
++ public final boolean hasMoreElements() { return nextEntry != null; }
++
++ public final void remove() {
+ if (lastReturned == null)
+ throw new IllegalStateException();
+ ConcurrentHashMap.this.remove(lastReturned.key);
+@@ -1142,16 +1284,16 @@
+ extends HashIterator
+ implements Iterator<K>, Enumeration<K>
+ {
+- public K next() { return super.nextEntry().key; }
+- public K nextElement() { return super.nextEntry().key; }
++ public final K next() { return super.nextEntry().key; }
++ public final K nextElement() { return super.nextEntry().key; }
+ }
+
+ final class ValueIterator
+ extends HashIterator
+ implements Iterator<V>, Enumeration<V>
+ {
+- public V next() { return super.nextEntry().value; }
+- public V nextElement() { return super.nextEntry().value; }
++ public final V next() { return super.nextEntry().value; }
++ public final V nextElement() { return super.nextEntry().value; }
+ }
+
+ /**
+@@ -1271,15 +1413,20 @@
+ * The key-value mappings are emitted in no particular order.
+ */
+ private void writeObject(java.io.ObjectOutputStream s) throws IOException {
++ // force all segments for serialization compatibility
++ for (int k = 0; k < segments.length; ++k)
++ ensureSegment(k);
+ s.defaultWriteObject();
+
++ final Segment<K,V>[] segments = this.segments;
+ for (int k = 0; k < segments.length; ++k) {
+- Segment<K,V> seg = segments[k];
++ Segment<K,V> seg = segmentAt(segments, k);
+ seg.lock();
+ try {
+ HashEntry<K,V>[] tab = seg.table;
+ for (int i = 0; i < tab.length; ++i) {
+- for (HashEntry<K,V> e = tab[i]; e != null; e = e.next) {
++ HashEntry<K,V> e;
++ for (e = entryAt(tab, i); e != null; e = e.next) {
+ s.writeObject(e.key);
+ s.writeObject(e.value);
+ }
+@@ -1297,13 +1444,20 @@
+ * stream (i.e., deserialize it).
+ * @param s the stream
+ */
++ @SuppressWarnings("unchecked")
+ private void readObject(java.io.ObjectInputStream s)
+ throws IOException, ClassNotFoundException {
+ s.defaultReadObject();
+
+- // Initialize each segment to be minimally sized, and let grow.
+- for (int i = 0; i < segments.length; ++i) {
+- segments[i].setTable(new HashEntry[1]);
++ // Re-initialize segments to be minimally sized, and let grow.
++ int cap = MIN_SEGMENT_TABLE_CAPACITY;
++ final Segment<K,V>[] segments = this.segments;
++ for (int k = 0; k < segments.length; ++k) {
++ Segment<K,V> seg = segments[k];
++ if (seg != null) {
++ seg.threshold = (int)(cap * seg.loadFactor);
++ seg.table = (HashEntry<K,V>[]) new HashEntry[cap];
++ }
+ }
+
+ // Read the keys and values, and put the mappings in the table
+@@ -1315,4 +1469,31 @@
+ put(key, value);
+ }
+ }
++
++ // Unsafe mechanics
++ private static final sun.misc.Unsafe UNSAFE;
++ private static final long SBASE;
++ private static final int SSHIFT;
++ private static final long TBASE;
++ private static final int TSHIFT;
++
++ static {
++ int ss, ts;
++ try {
++ UNSAFE = sun.misc.Unsafe.getUnsafe();
++ Class tc = HashEntry[].class;
++ Class sc = Segment[].class;
++ TBASE = UNSAFE.arrayBaseOffset(tc);
++ SBASE = UNSAFE.arrayBaseOffset(sc);
++ ts = UNSAFE.arrayIndexScale(tc);
++ ss = UNSAFE.arrayIndexScale(sc);
++ } catch (Exception e) {
++ throw new Error(e);
++ }
++ if ((ss & (ss-1)) != 0 || (ts & (ts-1)) != 0)
++ throw new Error("data type scale not a power of two");
++ SSHIFT = 31 - Integer.numberOfLeadingZeros(ss);
++ TSHIFT = 31 - Integer.numberOfLeadingZeros(ts);
++ }
++
+ }
diff --git a/java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch b/java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch
new file mode 100644
index 000000000000..9c90bae5ed0b
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch
@@ -0,0 +1,71 @@
+diff -Nru openjdk.orig/jdk/src/share/classes/java/beans/Introspector.java openjdk/jdk/src/share/classes/java/beans/Introspector.java
+--- jdk/src/share/classes/java/beans/Introspector.java 2013-04-16 14:35:31.707279166 +0100
++++ jdk/src/share/classes/java/beans/Introspector.java 2013-04-16 14:39:23.715018865 +0100
+@@ -102,7 +102,7 @@
+ public final static int IGNORE_ALL_BEANINFO = 3;
+
+ // Static Caches to speed up introspection.
+- private static final WeakCache<Class<?>, Method[]> declaredMethodCache = new WeakCache<>();
++ private static final WeakCache<Class<?>, Method[]> declaredMethodCache = new WeakCache<Class<?>, Method[]>();
+
+ private Class beanClass;
+ private BeanInfo explicitBeanInfo;
+diff -Nru openjdk.orig/jdk/src/share/classes/java/beans/ThreadGroupContext.java openjdk/jdk/src/share/classes/java/beans/ThreadGroupContext.java
+--- jdk/src/share/classes/java/beans/ThreadGroupContext.java 2013-04-16 14:35:31.707279166 +0100
++++ jdk/src/share/classes/java/beans/ThreadGroupContext.java 2013-04-16 14:40:01.243623831 +0100
+@@ -25,9 +25,6 @@
+
+ package java.beans;
+
+-import com.sun.beans.finder.BeanInfoFinder;
+-import com.sun.beans.finder.PropertyEditorFinder;
+-
+ import java.awt.GraphicsEnvironment;
+ import java.util.HashMap;
+ import java.util.Map;
+@@ -42,7 +39,7 @@
+ */
+ final class ThreadGroupContext {
+
+- private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<>();
++ private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<ThreadGroup, ThreadGroupContext>();
+
+ /**
+ * Returns the appropriate {@code AppContext} for the caller,
+@@ -66,8 +63,6 @@
+ private volatile Boolean isGuiAvailable;
+
+ private Map<Class<?>, BeanInfo> beanInfoCache;
+- private BeanInfoFinder beanInfoFinder;
+- private PropertyEditorFinder propertyEditorFinder;
+
+
+ boolean isDesignTime() {
+@@ -99,7 +94,7 @@
+
+ BeanInfo putBeanInfo(Class<?> type, BeanInfo info) {
+ if (this.beanInfoCache == null) {
+- this.beanInfoCache = new WeakHashMap<>();
++ this.beanInfoCache = new WeakHashMap<Class<?>, BeanInfo>();
+ }
+ return this.beanInfoCache.put(type, info);
+ }
+@@ -116,18 +111,4 @@
+ }
+ }
+
+-
+- synchronized BeanInfoFinder getBeanInfoFinder() {
+- if (this.beanInfoFinder == null) {
+- this.beanInfoFinder = new BeanInfoFinder();
+- }
+- return this.beanInfoFinder;
+- }
+-
+- synchronized PropertyEditorFinder getPropertyEditorFinder() {
+- if (this.propertyEditorFinder == null) {
+- this.propertyEditorFinder = new PropertyEditorFinder();
+- }
+- return this.propertyEditorFinder;
+- }
+ }
diff --git a/java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch b/java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch
new file mode 100644
index 000000000000..22d0e2caecd4
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch
@@ -0,0 +1,436 @@
+# HG changeset patch
+# User andrew
+# Date 1365712268 -3600
+# Node ID 4d66f7ebcf99c1b322f47ff0aa6adadcd995f8f4
+# Parent df591e0dfd349dc5986cc17949939c588d5a9690
+7064279: Introspector.getBeanInfo() should release some resources in timely manner
+Reviewed-by: art, alexp
+
+diff --git a/src/share/classes/java/beans/Beans.java b/src/share/classes/java/beans/Beans.java
+--- jdk/src/share/classes/java/beans/Beans.java
++++ jdk/src/share/classes/java/beans/Beans.java
+@@ -32,7 +32,6 @@
+ import java.applet.AppletStub;
+ import java.applet.AudioClip;
+
+-import java.awt.GraphicsEnvironment;
+ import java.awt.Image;
+
+ import java.beans.beancontext.BeanContext;
+@@ -53,15 +52,11 @@
+ import java.util.Iterator;
+ import java.util.Vector;
+
+-import sun.awt.AppContext;
+-
+ /**
+ * This class provides some general purpose beans control methods.
+ */
+
+ public class Beans {
+- private static final Object DESIGN_TIME = new Object();
+- private static final Object GUI_AVAILABLE = new Object();
+
+ /**
+ * <p>
+@@ -395,8 +390,7 @@
+ * @see DesignMode
+ */
+ public static boolean isDesignTime() {
+- Object value = AppContext.getAppContext().get(DESIGN_TIME);
+- return (value instanceof Boolean) && (Boolean) value;
++ return ThreadGroupContext.getContext().isDesignTime();
+ }
+
+ /**
+@@ -413,8 +407,7 @@
+ *
+ */
+ public static boolean isGuiAvailable() {
+- Object value = AppContext.getAppContext().get(GUI_AVAILABLE);
+- return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless();
++ return ThreadGroupContext.getContext().isGuiAvailable();
+ }
+
+ /**
+@@ -440,7 +433,7 @@
+ if (sm != null) {
+ sm.checkPropertiesAccess();
+ }
+- AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime));
++ ThreadGroupContext.getContext().setDesignTime(isDesignTime);
+ }
+
+ /**
+@@ -466,7 +459,7 @@
+ if (sm != null) {
+ sm.checkPropertiesAccess();
+ }
+- AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable));
++ ThreadGroupContext.getContext().setGuiAvailable(isGuiAvailable);
+ }
+ }
+
+diff --git a/src/share/classes/java/beans/Introspector.java b/src/share/classes/java/beans/Introspector.java
+--- jdk/src/share/classes/java/beans/Introspector.java
++++ jdk/src/share/classes/java/beans/Introspector.java
+@@ -38,7 +38,6 @@
+ import java.util.EventListener;
+ import java.util.List;
+ import java.util.TreeMap;
+-import sun.awt.AppContext;
+ import sun.reflect.misc.ReflectUtil;
+
+ /**
+@@ -103,10 +102,7 @@
+ public final static int IGNORE_ALL_BEANINFO = 3;
+
+ // Static Caches to speed up introspection.
+- private static WeakCache<Class<?>, Method[]> declaredMethodCache =
+- new WeakCache<Class<?>, Method[]>();
+-
+- private static final Object BEANINFO_CACHE = new Object();
++ private static final WeakCache<Class<?>, Method[]> declaredMethodCache = new WeakCache<>();
+
+ private Class beanClass;
+ private BeanInfo explicitBeanInfo;
+@@ -170,21 +166,15 @@
+ if (!ReflectUtil.isPackageAccessible(beanClass)) {
+ return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
+ }
+- WeakCache<Class<?>, BeanInfo> beanInfoCache;
++ ThreadGroupContext context = ThreadGroupContext.getContext();
+ BeanInfo beanInfo;
+- synchronized (BEANINFO_CACHE) {
+- beanInfoCache = (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
+-
+- if (beanInfoCache == null) {
+- beanInfoCache = new WeakCache<Class<?>, BeanInfo>();
+- AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache);
+- }
+- beanInfo = beanInfoCache.get(beanClass);
++ synchronized (declaredMethodCache) {
++ beanInfo = context.getBeanInfo(beanClass);
+ }
+ if (beanInfo == null) {
+ beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
+- synchronized (BEANINFO_CACHE) {
+- beanInfoCache.put(beanClass, beanInfo);
++ synchronized (declaredMethodCache) {
++ context.putBeanInfo(beanClass, beanInfo);
+ }
+ }
+ return beanInfo;
+@@ -334,11 +324,8 @@
+ */
+
+ public static void flushCaches() {
+- synchronized (BEANINFO_CACHE) {
+- WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE);
+- if (beanInfoCache != null) {
+- beanInfoCache.clear();
+- }
++ synchronized (declaredMethodCache) {
++ ThreadGroupContext.getContext().clearBeanInfoCache();
+ declaredMethodCache.clear();
+ }
+ }
+@@ -362,11 +349,8 @@
+ if (clz == null) {
+ throw new NullPointerException();
+ }
+- synchronized (BEANINFO_CACHE) {
+- WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE);
+- if (beanInfoCache != null) {
+- beanInfoCache.put(clz, null);
+- }
++ synchronized (declaredMethodCache) {
++ ThreadGroupContext.getContext().removeBeanInfo(clz);
+ declaredMethodCache.put(clz, null);
+ }
+ }
+@@ -1313,7 +1297,7 @@
+ if (!ReflectUtil.isPackageAccessible(clz)) {
+ return new Method[0];
+ }
+- synchronized (BEANINFO_CACHE) {
++ synchronized (declaredMethodCache) {
+ Method[] result = declaredMethodCache.get(clz);
+ if (result == null) {
+ result = clz.getMethods();
+diff --git a/src/share/classes/java/beans/ThreadGroupContext.java b/src/share/classes/java/beans/ThreadGroupContext.java
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/classes/java/beans/ThreadGroupContext.java
+@@ -0,0 +1,133 @@
++/*
++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package java.beans;
++
++import com.sun.beans.finder.BeanInfoFinder;
++import com.sun.beans.finder.PropertyEditorFinder;
++
++import java.awt.GraphicsEnvironment;
++import java.util.HashMap;
++import java.util.Map;
++import java.util.WeakHashMap;
++
++/**
++ * The {@code ThreadGroupContext} is an application-dependent
++ * context referenced by the specific {@link ThreadGroup}.
++ * This is a replacement for the {@link sun.awt.AppContext}.
++ *
++ * @author Sergey Malenkov
++ */
++final class ThreadGroupContext {
++
++ private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<>();
++
++ /**
++ * Returns the appropriate {@code AppContext} for the caller,
++ * as determined by its {@code ThreadGroup}.
++ *
++ * @return the application-dependent context
++ */
++ static ThreadGroupContext getContext() {
++ ThreadGroup group = Thread.currentThread().getThreadGroup();
++ synchronized (contexts) {
++ ThreadGroupContext context = contexts.get(group);
++ if (context == null) {
++ context = new ThreadGroupContext();
++ contexts.put(group, context);
++ }
++ return context;
++ }
++ }
++
++ private volatile boolean isDesignTime;
++ private volatile Boolean isGuiAvailable;
++
++ private Map<Class<?>, BeanInfo> beanInfoCache;
++ private BeanInfoFinder beanInfoFinder;
++ private PropertyEditorFinder propertyEditorFinder;
++
++
++ boolean isDesignTime() {
++ return this.isDesignTime;
++ }
++
++ void setDesignTime(boolean isDesignTime) {
++ this.isDesignTime = isDesignTime;
++ }
++
++
++ boolean isGuiAvailable() {
++ Boolean isGuiAvailable = this.isGuiAvailable;
++ return (isGuiAvailable != null)
++ ? isGuiAvailable.booleanValue()
++ : !GraphicsEnvironment.isHeadless();
++ }
++
++ void setGuiAvailable(boolean isGuiAvailable) {
++ this.isGuiAvailable = Boolean.valueOf(isGuiAvailable);
++ }
++
++
++ BeanInfo getBeanInfo(Class<?> type) {
++ return (this.beanInfoCache != null)
++ ? this.beanInfoCache.get(type)
++ : null;
++ }
++
++ BeanInfo putBeanInfo(Class<?> type, BeanInfo info) {
++ if (this.beanInfoCache == null) {
++ this.beanInfoCache = new WeakHashMap<>();
++ }
++ return this.beanInfoCache.put(type, info);
++ }
++
++ void removeBeanInfo(Class<?> type) {
++ if (this.beanInfoCache != null) {
++ this.beanInfoCache.remove(type);
++ }
++ }
++
++ void clearBeanInfoCache() {
++ if (this.beanInfoCache != null) {
++ this.beanInfoCache.clear();
++ }
++ }
++
++
++ synchronized BeanInfoFinder getBeanInfoFinder() {
++ if (this.beanInfoFinder == null) {
++ this.beanInfoFinder = new BeanInfoFinder();
++ }
++ return this.beanInfoFinder;
++ }
++
++ synchronized PropertyEditorFinder getPropertyEditorFinder() {
++ if (this.propertyEditorFinder == null) {
++ this.propertyEditorFinder = new PropertyEditorFinder();
++ }
++ return this.propertyEditorFinder;
++ }
++}
+diff --git a/test/java/beans/Beans/6669869/TestDesignTime.java b/test/java/beans/Beans/6669869/TestDesignTime.java
+--- jdk/test/java/beans/Beans/6669869/TestDesignTime.java
++++ jdk/test/java/beans/Beans/6669869/TestDesignTime.java
+@@ -29,7 +29,6 @@
+ */
+
+ import java.beans.Beans;
+-import sun.awt.SunToolkit;
+
+ public class TestDesignTime implements Runnable {
+ public static void main(String[] args) throws InterruptedException {
+@@ -44,7 +43,6 @@
+ }
+
+ public void run() {
+- SunToolkit.createNewAppContext();
+ if (Beans.isDesignTime()) {
+ throw new Error("shared DesignTime property");
+ }
+diff --git a/test/java/beans/Beans/6669869/TestGuiAvailable.java b/test/java/beans/Beans/6669869/TestGuiAvailable.java
+--- jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java
++++ jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java
+@@ -30,7 +30,6 @@
+
+ import java.awt.GraphicsEnvironment;
+ import java.beans.Beans;
+-import sun.awt.SunToolkit;
+
+ public class TestGuiAvailable implements Runnable {
+ public static void main(String[] args) throws InterruptedException {
+@@ -45,7 +44,6 @@
+ }
+
+ public void run() {
+- SunToolkit.createNewAppContext();
+ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
+ throw new Error("shared GuiAvailable property");
+ }
+diff --git a/test/java/beans/Introspector/7064279/Test7064279.java b/test/java/beans/Introspector/7064279/Test7064279.java
+new file mode 100644
+--- /dev/null
++++ jdk/test/java/beans/Introspector/7064279/Test7064279.java
+@@ -0,0 +1,75 @@
++/*
++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++/*
++ * @test
++ * @bug 7064279
++ * @summary Tests that Introspector does not have strong references to context class loader
++ * @author Sergey Malenkov
++ */
++
++import java.beans.Introspector;
++import java.io.File;
++import java.lang.ref.WeakReference;
++import java.net.URL;
++import java.net.URLClassLoader;
++
++public class Test7064279 {
++
++ public static void main(String[] args) throws Exception {
++ WeakReference ref = new WeakReference(test("test.jar", "test.Test"));
++ try {
++ int[] array = new int[1024];
++ while (true) {
++ array = new int[array.length << 1];
++ }
++ }
++ catch (OutOfMemoryError error) {
++ System.gc();
++ }
++ if (null != ref.get()) {
++ throw new Error("ClassLoader is not released");
++ }
++ }
++
++ private static Object test(String jarName, String className) throws Exception {
++ StringBuilder sb = new StringBuilder(256);
++ sb.append("file:");
++ sb.append(System.getProperty("test.src", "."));
++ sb.append(File.separatorChar);
++ sb.append(jarName);
++
++ ClassLoader newLoader = new URLClassLoader(new URL[] { new URL(sb.toString()) });
++ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
++
++ Thread.currentThread().setContextClassLoader(newLoader);
++ test(newLoader.loadClass(className));
++ Thread.currentThread().setContextClassLoader(oldLoader);
++
++ return newLoader;
++ }
++
++ private static void test(Class type) throws Exception {
++ Introspector.getBeanInfo(type);
++ }
++}
+diff --git a/test/java/beans/Introspector/Test6660539.java b/test/java/beans/Introspector/Test6660539.java
+--- jdk/test/java/beans/Introspector/Test6660539.java
++++ jdk/test/java/beans/Introspector/Test6660539.java
+@@ -28,8 +28,6 @@
+ * @author Sergey Malenkov
+ */
+
+-import sun.awt.SunToolkit;
+-
+ import java.beans.BeanInfo;
+ import java.beans.IntrospectionException;
+ import java.beans.Introspector;
+@@ -49,7 +47,6 @@
+ }
+
+ public void run() {
+- SunToolkit.createNewAppContext();
+ for (PropertyDescriptor pd : getPropertyDescriptors()) {
+ if (pd.getDisplayName().equals(NAME))
+ throw new Error("shared BeanInfo cache");
diff --git a/java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch b/java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch
new file mode 100644
index 000000000000..9b61dd6a6d73
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch
@@ -0,0 +1,299 @@
+--- /dev/null 2013-04-25 14:11:00.000000000 -0400
++++ jaxp/patches/jaxp_src/7133220-factory_finder_parser_transform_useBSClassLoader.patch 2013-04-25 14:19:44.000000000 -0400
+@@ -0,0 +1,296 @@
++--- src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:37:39.305820912 -0400
+++++ src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:28:52.947388255 -0400
++@@ -25,15 +25,12 @@
++
++ package javax.xml.parsers;
++
++-import java.io.File;
++-import java.io.FileInputStream;
++-
++-import java.util.Properties;
++ import java.io.BufferedReader;
+++import java.io.File;
++ import java.io.IOException;
++ import java.io.InputStream;
++ import java.io.InputStreamReader;
++-import java.net.URL;
+++import java.util.Properties;
++
++ /**
++ * <p>Implements pluggable Datatypes.</p>
++@@ -42,6 +39,7 @@
++ * sync. It is package private for secure class loading.</p>
++ *
++ * @author Santiago.PericasGeertsen@sun.com
+++ * @author Huizhe.Wang@oracle.com
++ */
++ class FactoryFinder {
++
++@@ -95,18 +93,24 @@
++ * If the class loader supplied is <code>null</code>, first try using the
++ * context class loader followed by the current (i.e. bootstrap) class
++ * loader.
+++ *
+++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true
++ */
++ static private Class getProviderClass(String className, ClassLoader cl,
++- boolean doFallback) throws ClassNotFoundException
+++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException
++ {
++ try {
++ if (cl == null) {
++- cl = ss.getContextClassLoader();
++- if (cl == null) {
++- throw new ClassNotFoundException();
++- }
++- else {
++- return cl.loadClass(className);
+++ if (useBSClsLoader) {
+++ return Class.forName(className, true, FactoryFinder.class.getClassLoader());
+++ } else {
+++ cl = ss.getContextClassLoader();
+++ if (cl == null) {
+++ throw new ClassNotFoundException();
+++ }
+++ else {
+++ return cl.loadClass(className);
+++ }
++ }
++ }
++ else {
++@@ -131,8 +135,8 @@
++ * @param className Name of the concrete class corresponding to the
++ * service provider
++ *
++- * @param cl ClassLoader to use to load the class, null means to use
++- * the bootstrap ClassLoader
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
++ *
++ * @param doFallback True if the current ClassLoader should be tried as
++ * a fallback if the class is not found using cl
++@@ -140,8 +144,30 @@
++ static Object newInstance(String className, ClassLoader cl, boolean doFallback)
++ throws ConfigurationError
++ {
+++ return newInstance(className, cl, doFallback, false);
+++ }
+++
+++ /**
+++ * Create an instance of a class. Delegates to method
+++ * <code>getProviderClass()</code> in order to load the class.
+++ *
+++ * @param className Name of the concrete class corresponding to the
+++ * service provider
+++ *
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
+++ *
+++ * @param doFallback True if the current ClassLoader should be tried as
+++ * a fallback if the class is not found using cl
+++ *
+++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter
+++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader.
+++ */
+++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader)
+++ throws ConfigurationError
+++ {
++ try {
++- Class providerClass = getProviderClass(className, cl, doFallback);
+++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader);
++ Object instance = providerClass.newInstance();
++ if (debug) { // Extra check to avoid computing cl strings
++ dPrint("created new instance of " + providerClass +
++@@ -244,6 +270,7 @@
++
++ // First try the Context ClassLoader
++ ClassLoader cl = ss.getContextClassLoader();
+++ boolean useBSClsLoader = false;
++ if (cl != null) {
++ is = ss.getResourceAsStream(cl, serviceId);
++
++@@ -251,11 +278,13 @@
++ if (is == null) {
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++ } else {
++ // No Context ClassLoader, try the current ClassLoader
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++
++ if (is == null) {
++@@ -293,7 +322,7 @@
++ // ClassLoader because we want to avoid the case where the
++ // resource file was found using one ClassLoader and the
++ // provider class was instantiated using a different one.
++- return newInstance(factoryClassName, cl, false);
+++ return newInstance(factoryClassName, cl, false, useBSClsLoader);
++ }
++
++ // No provider found
++--- src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:37:39.312820966 -0400
+++++ src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:35:08.715478293 -0400
++@@ -25,15 +25,12 @@
++
++ package javax.xml.transform;
++
++-import java.io.File;
++-import java.io.FileInputStream;
++-
++-import java.util.Properties;
++ import java.io.BufferedReader;
+++import java.io.File;
++ import java.io.IOException;
++ import java.io.InputStream;
++ import java.io.InputStreamReader;
++-import java.net.URL;
+++import java.util.Properties;
++
++ /**
++ * <p>Implements pluggable Datatypes.</p>
++@@ -42,6 +39,7 @@
++ * sync. It is package private for secure class loading.</p>
++ *
++ * @author Santiago.PericasGeertsen@sun.com
+++ * @author Huizhe.Wang@oracle.com
++ */
++ class FactoryFinder {
++
++@@ -95,18 +93,24 @@
++ * If the class loader supplied is <code>null</code>, first try using the
++ * context class loader followed by the current (i.e. bootstrap) class
++ * loader.
+++ *
+++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true
++ */
++ static private Class getProviderClass(String className, ClassLoader cl,
++- boolean doFallback) throws ClassNotFoundException
+++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException
++ {
++ try {
++ if (cl == null) {
++- cl = ss.getContextClassLoader();
++- if (cl == null) {
++- throw new ClassNotFoundException();
++- }
++- else {
++- return cl.loadClass(className);
+++ if (useBSClsLoader) {
+++ return Class.forName(className, true, FactoryFinder.class.getClassLoader());
+++ } else {
+++ cl = ss.getContextClassLoader();
+++ if (cl == null) {
+++ throw new ClassNotFoundException();
+++ }
+++ else {
+++ return cl.loadClass(className);
+++ }
++ }
++ }
++ else {
++@@ -131,8 +135,8 @@
++ * @param className Name of the concrete class corresponding to the
++ * service provider
++ *
++- * @param cl ClassLoader to use to load the class, null means to use
++- * the bootstrap ClassLoader
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
++ *
++ * @param doFallback True if the current ClassLoader should be tried as
++ * a fallback if the class is not found using cl
++@@ -140,8 +144,30 @@
++ static Object newInstance(String className, ClassLoader cl, boolean doFallback)
++ throws ConfigurationError
++ {
+++ return newInstance(className, cl, doFallback, false);
+++ }
+++
+++ /**
+++ * Create an instance of a class. Delegates to method
+++ * <code>getProviderClass()</code> in order to load the class.
+++ *
+++ * @param className Name of the concrete class corresponding to the
+++ * service provider
+++ *
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
+++ *
+++ * @param doFallback True if the current ClassLoader should be tried as
+++ * a fallback if the class is not found using cl
+++ *
+++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter
+++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader.
+++ */
+++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader)
+++ throws ConfigurationError
+++ {
++ try {
++- Class providerClass = getProviderClass(className, cl, doFallback);
+++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader);
++ Object instance = providerClass.newInstance();
++ if (debug) { // Extra check to avoid computing cl strings
++ dPrint("created new instance of " + providerClass +
++@@ -182,7 +208,7 @@
++ String systemProp = ss.getSystemProperty(factoryId);
++ if (systemProp != null) {
++ dPrint("found system property, value=" + systemProp);
++- return newInstance(systemProp, null, true);
+++ return newInstance(systemProp, null, true, false);
++ }
++ }
++ catch (SecurityException se) {
++@@ -210,7 +236,7 @@
++
++ if (factoryClassName != null) {
++ dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
++- return newInstance(factoryClassName, null, true);
+++ return newInstance(factoryClassName, null, true, false);
++ }
++ }
++ catch (Exception ex) {
++@@ -228,7 +254,7 @@
++ }
++
++ dPrint("loaded from fallback value: " + fallbackClassName);
++- return newInstance(fallbackClassName, null, true);
+++ return newInstance(fallbackClassName, null, true, false);
++ }
++
++ /*
++@@ -244,6 +270,7 @@
++
++ // First try the Context ClassLoader
++ ClassLoader cl = ss.getContextClassLoader();
+++ boolean useBSClsLoader = false;
++ if (cl != null) {
++ is = ss.getResourceAsStream(cl, serviceId);
++
++@@ -251,11 +278,13 @@
++ if (is == null) {
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
++- }
+++ useBSClsLoader = true;
+++ }
++ } else {
++ // No Context ClassLoader, try the current ClassLoader
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++
++ if (is == null) {
++@@ -293,7 +322,7 @@
++ // ClassLoader because we want to avoid the case where the
++ // resource file was found using one ClassLoader and the
++ // provider class was instantiated using a different one.
++- return newInstance(factoryClassName, cl, false);
+++ return newInstance(factoryClassName, cl, false, useBSClsLoader);
++ }
++
++ // No provider found
diff --git a/java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch b/java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch
new file mode 100644
index 000000000000..9102d48d1cad
--- /dev/null
+++ b/java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch
@@ -0,0 +1,75 @@
+diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security openjdk/jdk/src/share/lib/security/java.security
+--- jdk/src/share/lib/security/java.security 2013-04-16 14:23:48.623949921 +0100
++++ jdk/src/share/lib/security/java.security 2013-04-16 14:26:07.318184299 +0100
+@@ -128,7 +128,9 @@
+ # corresponding RuntimePermission ("accessClassInPackage."+package) has
+ # been granted.
+ package.access=sun.,\
+- com.sun.xml.internal.,\
++ com.sun.xml.internal.bind.,\
++ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.ws.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.
+@@ -144,7 +146,9 @@
+ # checkPackageDefinition.
+ #
+ package.definition=sun.,\
+- com.sun.xml.internal.,\
++ com.sun.xml.internal.bind.,\
++ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.ws.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.
+diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-solaris openjdk/jdk/src/share/lib/security/java.security-solaris
+--- jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:23:48.623949921 +0100
++++ jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:26:30.082551058 +0100
+@@ -129,7 +129,9 @@
+ # corresponding RuntimePermission ("accessClassInPackage."+package) has
+ # been granted.
+ package.access=sun.,\
+- com.sun.xml.internal.,\
++ com.sun.xml.internal.bind.,\
++ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.
+@@ -145,7 +147,9 @@
+ # checkPackageDefinition.
+ #
+ package.definition=sun.,\
+- com.sun.xml.internal.,\
++ com.sun.xml.internal.bind.,\
++ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.
+diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-windows openjdk/jdk/src/share/lib/security/java.security-windows
+--- jdk/src/share/lib/security/java.security-windows 2013-04-16 14:23:48.623949921 +0100
++++ jdk/src/share/lib/security/java.security-windows 2013-04-16 14:26:51.170890824 +0100
+@@ -129,7 +129,9 @@
+ # corresponding RuntimePermission ("accessClassInPackage."+package) has
+ # been granted.
+ package.access=sun.,\
+- com.sun.xml.internal.,\
++ com.sun.xml.internal.bind.,\
++ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.
+@@ -145,7 +147,9 @@
+ # checkPackageDefinition.
+ #
+ package.definition=sun.,\
+- com.sun.xml.internal.,\
++ com.sun.xml.internal.bind.,\
++ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.
diff --git a/java/openjdk6/files/icedtea/security/20130201/8001235.patch b/java/openjdk6/files/icedtea/security/20130201/8001235.patch
deleted file mode 100644
index 73d700c3bc30..000000000000
--- a/java/openjdk6/files/icedtea/security/20130201/8001235.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff -Nru jaxp.old/build.properties jaxp/build.properties
---- jaxp.old/build.properties 2013-02-01 21:59:17.360429006 +0000
-+++ jaxp/build.properties 2013-02-01 22:04:56.349681812 +0000
-@@ -77,6 +77,9 @@
- # Where patches to drop bundle sources live
- patches.dir=patches
-
-+# Patches to apply
-+jaxp_src.patch.list=8001235.patch
-+
- # Sanity information
- sanity.info= Sanity Settings:${line.separator}\
- ant.home=${ant.home}${line.separator}\
-diff -Nru jaxp.old/patches/jaxp_src/8001235.patch jaxp/patches/jaxp_src/8001235.patch
---- jaxp.old/patches/jaxp_src/8001235.patch 1970-01-01 01:00:00.000000000 +0100
-+++ jaxp/patches/jaxp_src/8001235.patch 2013-02-01 22:04:27.369232768 +0000
-@@ -0,0 +1,20 @@
-+# HG changeset patch
-+# User joehw
-+# Date 1351536837 25200
-+# Node ID 5df9207c4378b7f4b24d70b365714c5ee6318982
-+# Parent 5449d5396bd8deee90f18f29899343129e3cdc4e
-+8001235: Improve JAXP HTTP handling
-+Reviewed-by: lancea, skoivu
-+
-+diff --git a/src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java b/src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java
-+--- src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java
-++++ src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java
-+@@ -165,7 +165,7 @@ public class FuncSystemProperty extends
-+ * should already be fully qualified as path/filename
-+ * @param target The target property bag the file will be placed into.
-+ */
-+- public void loadPropertyFile(String file, Properties target)
-++ private void loadPropertyFile(String file, Properties target)
-+ {
-+ try
-+ {
diff --git a/java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch b/java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch
new file mode 100644
index 000000000000..5d96ca4ef3d7
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch
@@ -0,0 +1,54 @@
+--- /dev/null 2013-04-25 14:56:29.000000000 -0400
++++ jaxp/patches/jaxp_src/6657673-factory_finder.patch 2013-04-25 14:58:33.000000000 -0400
+@@ -0,0 +1,51 @@
++--- src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:42:32.138748378 -0400
+++++ src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:41:36.033419998 -0400
++@@ -44,7 +44,7 @@
++ * @author Santiago.PericasGeertsen@sun.com
++ */
++ class FactoryFinder {
++-
+++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal";
++ /**
++ * Internal debug flag.
++ */
++@@ -140,6 +140,14 @@
++ static Object newInstance(String className, ClassLoader cl, boolean doFallback)
++ throws ConfigurationError
++ {
+++ // make sure we have access to restricted packages
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ cl = null;
+++ useBSClsLoader = true;
+++ }
+++ }
+++
++ try {
++ Class providerClass = getProviderClass(className, cl, doFallback);
++ Object instance = providerClass.newInstance();
++--- src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:42:32.230748906 -0400
+++++ src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:41:41.268451218 -0400
++@@ -44,6 +44,7 @@
++ * @author Santiago.PericasGeertsen@sun.com
++ */
++ class FactoryFinder {
+++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xalan.internal.";
++
++ /**
++ * Internal debug flag.
++@@ -140,6 +141,14 @@
++ static Object newInstance(String className, ClassLoader cl, boolean doFallback)
++ throws ConfigurationError
++ {
+++ // make sure we have access to restricted packages
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ cl = null;
+++ useBSClsLoader = true;
+++ }
+++ }
+++
++ try {
++ Class providerClass = getProviderClass(className, cl, doFallback);
++ Object instance = providerClass.newInstance();
diff --git a/java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch b/java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch
new file mode 100644
index 000000000000..570678055380
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch
@@ -0,0 +1,228 @@
+--- /dev/null 2013-04-25 14:48:41.000000000 -0400
++++ jaxp/patches/jaxp_src/6657673-fixup.patch 2013-04-25 14:51:50.000000000 -0400
+@@ -0,0 +1,225 @@
++--- src/com/sun/org/apache/xml/internal/serializer/CharInfo.java
+++++ src/com/sun/org/apache/xml/internal/serializer/CharInfo.java
++@@ -36,6 +36,8 @@
++
++ import javax.xml.transform.TransformerException;
++
+++import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
+++
++ import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
++ import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
++ import com.sun.org.apache.xml.internal.serializer.utils.Utils;
++--- /dev/null
+++++ src/com/sun/org/apache/xml/internal/serializer/ObjectFactory.java
++@@ -0,0 +1,200 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2001-2004 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++/*
+++ * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 08:15:20 suresh_emailid Exp $
+++ */
+++
+++package com.sun.org.apache.xml.internal.serializer;
+++
+++import java.io.BufferedReader;
+++import java.io.File;
+++import java.io.FileInputStream;
+++import java.io.IOException;
+++import java.io.InputStream;
+++import java.io.InputStreamReader;
+++import java.util.Properties;
+++
+++/**
+++ * This class is duplicated for each JAXP subpackage so keep it in sync.
+++ * It is package private and therefore is not exposed as part of the JAXP
+++ * API.
+++ * <p>
+++ * This code is designed to implement the JAXP 1.1 spec pluggability
+++ * feature and is designed to run on JDK version 1.1 and
+++ * later, and to compile on JDK 1.2 and onward.
+++ * The code also runs both as part of an unbundled jar file and
+++ * when bundled as part of the JDK.
+++ * <p>
+++ * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code>
+++ * class and modified to be used as a general utility for creating objects
+++ * dynamically.
+++ *
+++ * @xsl.usage internal
+++ */
+++class ObjectFactory {
+++
+++ //
+++ // Constants
+++ //
+++
+++ // name of default properties file to look for in JDK's jre/lib directory
+++ private static final String DEFAULT_PROPERTIES_FILENAME =
+++ "xalan.properties";
+++
+++ private static final String SERVICES_PATH = "META-INF/services/";
+++
+++ /** Set to true for debugging */
+++ private static final boolean DEBUG = false;
+++
+++ /** cache the contents of the xalan.properties file.
+++ * Until an attempt has been made to read this file, this will
+++ * be null; if the file does not exist or we encounter some other error
+++ * during the read, this will be empty.
+++ */
+++ private static Properties fXalanProperties = null;
+++
+++ /***
+++ * Cache the time stamp of the xalan.properties file so
+++ * that we know if it's been modified and can invalidate
+++ * the cache when necessary.
+++ */
+++ private static long fLastModified = -1;
+++
+++ /**
+++ * Create an instance of a class using the specified ClassLoader
+++ */
+++ static Object newInstance(String className, ClassLoader cl,
+++ boolean doFallback)
+++ throws ConfigurationError
+++ {
+++ // assert(className != null);
+++ try{
+++ Class providerClass = findProviderClass(className, cl, doFallback);
+++ Object instance = providerClass.newInstance();
+++ return instance;
+++ } catch (ClassNotFoundException x) {
+++ throw new ConfigurationError(
+++ "Provider " + className + " not found", x);
+++ } catch (Exception x) {
+++ throw new ConfigurationError(
+++ "Provider " + className + " could not be instantiated: " + x,
+++ x);
+++ }
+++ }
+++
+++ /**
+++ * Find a Class using the specified ClassLoader
+++ */
+++ static Class findProviderClass(String className, ClassLoader cl,
+++ boolean doFallback)
+++ throws ClassNotFoundException, ConfigurationError
+++ {
+++ //throw security exception if the calling thread is not allowed to access the
+++ //class. Restrict the access to the package classes as specified in java.security policy.
+++ SecurityManager security = System.getSecurityManager();
+++ try{
+++ if (security != null){
+++ final int lastDot = className.lastIndexOf(".");
+++ String packageName = className;
+++ if (lastDot != -1) packageName = className.substring(0, lastDot);
+++ security.checkPackageAccess(packageName);
+++ }
+++ }catch(SecurityException e){
+++ throw e;
+++ }
+++
+++ Class providerClass;
+++ if (cl == null) {
+++ // XXX Use the bootstrap ClassLoader. There is no way to
+++ // load a class using the bootstrap ClassLoader that works
+++ // in both JDK 1.1 and Java 2. However, this should still
+++ // work b/c the following should be true:
+++ //
+++ // (cl == null) iff current ClassLoader == null
+++ //
+++ // Thus Class.forName(String) will use the current
+++ // ClassLoader which will be the bootstrap ClassLoader.
+++ providerClass = Class.forName(className);
+++ } else {
+++ try {
+++ providerClass = cl.loadClass(className);
+++ } catch (ClassNotFoundException x) {
+++ if (doFallback) {
+++ // Fall back to current classloader
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++ if (current == null) {
+++ providerClass = Class.forName(className);
+++ } else if (cl != current) {
+++ cl = current;
+++ providerClass = cl.loadClass(className);
+++ } else {
+++ throw x;
+++ }
+++ } else {
+++ throw x;
+++ }
+++ }
+++ }
+++
+++ return providerClass;
+++ }
+++
+++ //
+++ // Classes
+++ //
+++
+++ /**
+++ * A configuration error.
+++ */
+++ static class ConfigurationError
+++ extends Error {
+++ static final long serialVersionUID = 8859254254255146542L;
+++ //
+++ // Data
+++ //
+++
+++ /** Exception. */
+++ private Exception exception;
+++
+++ //
+++ // Constructors
+++ //
+++
+++ /**
+++ * Construct a new instance with the specified detail string and
+++ * exception.
+++ */
+++ ConfigurationError(String msg, Exception x) {
+++ super(msg);
+++ this.exception = x;
+++ } // <init>(String,Exception)
+++
+++ //
+++ // Public methods
+++ //
+++
+++ /** Returns the exception associated to this error. */
+++ Exception getException() {
+++ return exception;
+++ } // getException():Exception
+++
+++ } // class ConfigurationError
+++
+++} // class ObjectFactory
++--- src/com/sun/org/apache/xml/internal/serializer/SerializerFactory.java
+++++ src/com/sun/org/apache/xml/internal/serializer/SerializerFactory.java
++@@ -126,7 +126,7 @@
++
++
++
++- ClassLoader loader = ObjectFactory.findClassLoader();
+++ ClassLoader loader = com.sun.org.apache.xalan.internal.utils.ObjectFactory.findClassLoader();
++
++ Class cls = ObjectFactory.findProviderClass(className, loader, true);
++
diff --git a/java/openjdk6/files/icedtea/security/20130416/6657673.patch b/java/openjdk6/files/icedtea/security/20130416/6657673.patch
new file mode 100644
index 000000000000..c2a57be334bd
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/6657673.patch
@@ -0,0 +1,9381 @@
+--- /dev/null 2013-04-25 14:33:00.000000000 -0400
++++ jaxp/patches/jaxp_src/6657673.patch 2013-04-25 14:43:01.000000000 -0400
+@@ -0,0 +1,9198 @@
++--- src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java 2013-04-16 14:28:09.232148559 +0100
+++++ src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java 2013-04-16 14:29:26.549394382 +0100
++@@ -63,6 +63,7 @@
++ import com.sun.org.apache.bcel.internal.util.ClassVector;
++ import com.sun.org.apache.bcel.internal.util.ClassQueue;
++ import com.sun.org.apache.bcel.internal.generic.Type;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ import java.io.*;
++ import java.util.StringTokenizer;
++@@ -77,6 +78,7 @@
++ * class file. Those interested in programatically generating classes
++ * should see the <a href="../generic/ClassGen.html">ClassGen</a> class.
++
+++ * @version $Id: JavaClass.java,v 1.4 2007-07-19 04:34:42 ofung Exp $
++ * @see com.sun.org.apache.bcel.internal.generic.ClassGen
++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
++ */
++@@ -451,9 +453,9 @@
++ String debug = null, sep = null;
++
++ try {
++- debug = System.getProperty("JavaClass.debug");
+++ debug = SecuritySupport.getSystemProperty("JavaClass.debug");
++ // Get path separator either / or \ usually
++- sep = System.getProperty("file.separator");
+++ sep = SecuritySupport.getSystemProperty("file.separator");
++ }
++ catch (SecurityException e) {
++ // falls through
++--- src/com/sun/org/apache/bcel/internal/util/Class2HTML.java 2013-04-16 14:28:09.312149848 +0100
+++++ src/com/sun/org/apache/bcel/internal/util/Class2HTML.java 2013-04-16 14:29:26.549394382 +0100
++@@ -82,6 +82,7 @@
++ * method in the Method's frame will jump to the appropiate method in
++ * the Code frame.
++ *
+++ * @version $Id: Class2HTML.java,v 1.3 2007-07-19 04:34:52 ofung Exp $
++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
++ */
++ public class Class2HTML implements Constants
++@@ -137,7 +138,7 @@
++ ClassParser parser=null;
++ JavaClass java_class=null;
++ String zip_file = null;
++- char sep = System.getProperty("file.separator").toCharArray()[0];
+++ char sep = SecuritySupport.getSystemProperty("file.separator").toCharArray()[0];
++ String dir = "." + sep; // Where to store HTML files
++
++ try {
++--- src/com/sun/org/apache/bcel/internal/util/ClassPath.java 2013-04-16 14:28:09.316149912 +0100
+++++ src/com/sun/org/apache/bcel/internal/util/ClassPath.java 2013-04-16 14:29:26.549394382 +0100
++@@ -66,6 +66,7 @@
++ * Responsible for loading (class) files from the CLASSPATH. Inspired by
++ * sun.tools.ClassPath.
++ *
+++ * @version $Id: ClassPath.java,v 1.4 2007-07-19 04:34:52 ofung Exp $
++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
++ */
++ public class ClassPath implements Serializable {
++@@ -83,7 +84,7 @@
++ ArrayList vec = new ArrayList();
++
++ for(StringTokenizer tok=new StringTokenizer(class_path,
++- System.getProperty("path.separator"));
+++ SecuritySupport.getSystemProperty("path.separator"));
++ tok.hasMoreTokens();)
++ {
++ String path = tok.nextToken();
++@@ -92,7 +93,7 @@
++ File file = new File(path);
++
++ try {
++- if(file.exists()) {
+++ if(SecuritySupport.getFileExists(file)) {
++ if(file.isDirectory())
++ vec.add(new Dir(path));
++ else
++@@ -143,8 +144,9 @@
++ String name = tok.nextToken();
++ File file = new File(name);
++
++- if(file.exists())
+++ if(SecuritySupport.getFileExists(file)) {
++ list.add(name);
+++ }
++ }
++ }
++ }
++@@ -159,9 +161,9 @@
++ String class_path, boot_path, ext_path;
++
++ try {
++- class_path = System.getProperty("java.class.path");
++- boot_path = System.getProperty("sun.boot.class.path");
++- ext_path = System.getProperty("java.ext.dirs");
+++ class_path = SecuritySupport.getSystemProperty("java.class.path");
+++ boot_path = SecuritySupport.getSystemProperty("sun.boot.class.path");
+++ ext_path = SecuritySupport.getSystemProperty("java.ext.dirs");
++ }
++ catch (SecurityException e) {
++ return "";
++@@ -176,8 +178,8 @@
++ getPathComponents(ext_path, dirs);
++
++ for(Iterator e = dirs.iterator(); e.hasNext(); ) {
++- File ext_dir = new File((String)e.next());
++- String[] extensions = ext_dir.list(new FilenameFilter() {
+++ File ext_dir = new File((String)e.next());
+++ String[] extensions = SecuritySupport.getFileList(ext_dir, new FilenameFilter() {
++ public boolean accept(File dir, String name) {
++ name = name.toLowerCase();
++ return name.endsWith(".zip") || name.endsWith(".jar");
++@@ -342,7 +344,7 @@
++ final File file = new File(dir + File.separatorChar +
++ name.replace('.', File.separatorChar) + suffix);
++
++- return file.exists()? new ClassFile() {
+++ return SecuritySupport.getFileExists(file)? new ClassFile() {
++ public InputStream getInputStream() throws IOException { return new FileInputStream(file); }
++
++ public String getPath() { try {
++--- src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java 2013-04-16 14:28:09.316149912 +0100
+++++ src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java 2013-04-16 14:29:26.549394382 +0100
++@@ -72,6 +72,7 @@
++ * <pre>java com.sun.org.apache.bcel.internal.util.JavaWrapper -Dbcel.classloader=foo.MyLoader &lt;real.class.name&gt; [arguments]</pre>
++ * </p>
++ *
+++ * @version $Id: JavaWrapper.java,v 1.3 2007-07-19 04:34:52 ofung Exp $
++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
++ * @see ClassLoader
++ */
++@@ -79,7 +80,7 @@
++ private java.lang.ClassLoader loader;
++
++ private static java.lang.ClassLoader getClassLoader() {
++- String s = System.getProperty("bcel.classloader");
+++ String s = SecuritySupport.getSystemProperty("bcel.classloader");
++
++ if((s == null) || "".equals(s))
++ s = "com.sun.org.apache.bcel.internal.util.ClassLoader";
++--- src/com/sun/org/apache/bcel/internal/util/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/bcel/internal/util/SecuritySupport.java 2013-04-16 14:29:26.549394382 +0100
++@@ -0,0 +1,223 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2002-2004 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++
+++package com.sun.org.apache.bcel.internal.util;
+++
+++import java.io.File;
+++import java.io.FileInputStream;
+++import java.io.FileNotFoundException;
+++import java.io.FilenameFilter;
+++import java.io.InputStream;
+++import java.lang.ClassLoader;
+++import java.security.AccessController;
+++import java.security.PrivilegedAction;
+++import java.security.PrivilegedActionException;
+++import java.security.PrivilegedExceptionAction;
+++import java.util.ListResourceBundle;
+++import java.util.Locale;
+++import java.util.MissingResourceException;
+++import java.util.ResourceBundle;
+++
+++/**
+++ * This class is duplicated for each subpackage so keep it in sync. It is
+++ * package private and therefore is not exposed as part of any API.
+++ *
+++ * @xerces.internal
+++ */
+++public final class SecuritySupport {
+++
+++ private static final SecuritySupport securitySupport = new SecuritySupport();
+++
+++ /**
+++ * Return an instance of this class.
+++ */
+++ public static SecuritySupport getInstance() {
+++ return securitySupport;
+++ }
+++
+++ static ClassLoader getContextClassLoader() {
+++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ try {
+++ cl = Thread.currentThread().getContextClassLoader();
+++ } catch (SecurityException ex) {
+++ }
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ static ClassLoader getSystemClassLoader() {
+++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ try {
+++ cl = ClassLoader.getSystemClassLoader();
+++ } catch (SecurityException ex) {
+++ }
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ static ClassLoader getParentClassLoader(final ClassLoader cl) {
+++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader parent = null;
+++ try {
+++ parent = cl.getParent();
+++ } catch (SecurityException ex) {
+++ }
+++
+++ // eliminate loops in case of the boot
+++ // ClassLoader returning itself as a parent
+++ return (parent == cl) ? null : parent;
+++ }
+++ });
+++ }
+++
+++ public static String getSystemProperty(final String propName) {
+++ return (String) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return System.getProperty(propName);
+++ }
+++ });
+++ }
+++
+++ static FileInputStream getFileInputStream(final File file)
+++ throws FileNotFoundException {
+++ try {
+++ return (FileInputStream) AccessController.doPrivileged(new PrivilegedExceptionAction() {
+++ public Object run() throws FileNotFoundException {
+++ return new FileInputStream(file);
+++ }
+++ });
+++ } catch (PrivilegedActionException e) {
+++ throw (FileNotFoundException) e.getException();
+++ }
+++ }
+++
+++ /**
+++ * Return resource using the same classloader for the ObjectFactory by
+++ * default or bootclassloader when Security Manager is in place
+++ */
+++ public static InputStream getResourceAsStream(final String name) {
+++ if (System.getSecurityManager() != null) {
+++ return getResourceAsStream(null, name);
+++ } else {
+++ return getResourceAsStream(findClassLoader(), name);
+++ }
+++ }
+++
+++ public static InputStream getResourceAsStream(final ClassLoader cl,
+++ final String name) {
+++ return (InputStream) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ InputStream ris;
+++ if (cl == null) {
+++ ris = Object.class.getResourceAsStream("/" + name);
+++ } else {
+++ ris = cl.getResourceAsStream(name);
+++ }
+++ return ris;
+++ }
+++ });
+++ }
+++
+++ /**
+++ * Gets a resource bundle using the specified base name, the default locale,
+++ * and the caller's class loader.
+++ *
+++ * @param bundle the base name of the resource bundle, a fully qualified
+++ * class name
+++ * @return a resource bundle for the given base name and the default locale
+++ */
+++ public static ListResourceBundle getResourceBundle(String bundle) {
+++ return getResourceBundle(bundle, Locale.getDefault());
+++ }
+++
+++ /**
+++ * Gets a resource bundle using the specified base name and locale, and the
+++ * caller's class loader.
+++ *
+++ * @param bundle the base name of the resource bundle, a fully qualified
+++ * class name
+++ * @param locale the locale for which a resource bundle is desired
+++ * @return a resource bundle for the given base name and locale
+++ */
+++ public static ListResourceBundle getResourceBundle(final String bundle, final Locale locale) {
+++ return AccessController.doPrivileged(new PrivilegedAction<ListResourceBundle>() {
+++ public ListResourceBundle run() {
+++ try {
+++ return (ListResourceBundle) ResourceBundle.getBundle(bundle, locale);
+++ } catch (MissingResourceException e) {
+++ try {
+++ return (ListResourceBundle) ResourceBundle.getBundle(bundle, new Locale("en", "US"));
+++ } catch (MissingResourceException e2) {
+++ throw new MissingResourceException(
+++ "Could not load any resource bundle by " + bundle, bundle, "");
+++ }
+++ }
+++ }
+++ });
+++ }
+++
+++ public static String[] getFileList(final File f, final FilenameFilter filter) {
+++ return ((String[]) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return f.list(filter);
+++ }
+++ }));
+++ }
+++
+++ public static boolean getFileExists(final File f) {
+++ return ((Boolean) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return f.exists() ? Boolean.TRUE : Boolean.FALSE;
+++ }
+++ })).booleanValue();
+++ }
+++
+++ static long getLastModified(final File f) {
+++ return ((Long) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return new Long(f.lastModified());
+++ }
+++ })).longValue();
+++ }
+++
+++
+++ /**
+++ * Figure out which ClassLoader to use.
+++ */
+++ public static ClassLoader findClassLoader()
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ //this will ensure bootclassloader is used
+++ return null;
+++ } else {
+++ return SecuritySupport.class.getClassLoader();
+++ }
+++ } // findClassLoader():ClassLoader
+++
+++ private SecuritySupport() {
+++ }
+++}
++--- src/com/sun/org/apache/xalan/internal/res/XSLMessages.java 2013-04-16 14:28:09.324150042 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLMessages.java 2013-04-16 14:29:26.549394382 +0100
++@@ -22,68 +22,72 @@
++ */
++ package com.sun.org.apache.xalan.internal.res;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.util.ListResourceBundle;
++
++ import com.sun.org.apache.xpath.internal.res.XPATHMessages;
++
++ /**
++- * Sets things up for issuing error messages. This class is misnamed, and
++- * should be called XalanMessages, or some such.
+++ * Sets things up for issuing error messages. This class is misnamed, and should
+++ * be called XalanMessages, or some such.
+++ *
++ * @xsl.usage internal
++ */
++-public class XSLMessages extends XPATHMessages
++-{
+++public class XSLMessages extends XPATHMessages {
++
++- /** The language specific resource object for Xalan messages. */
++- private static ListResourceBundle XSLTBundle = null;
++-
++- /** The class name of the Xalan error message string table. */
++- private static final String XSLT_ERROR_RESOURCES =
++- "com.sun.org.apache.xalan.internal.res.XSLTErrorResources";
++-
++- /**
++- * Creates a message from the specified key and replacement
++- * arguments, localized to the given locale.
++- *
++- * @param msgKey The key for the message text.
++- * @param args The arguments to be used as replacement text
++- * in the message created.
++- *
++- * @return The formatted message string.
++- */
++- public static final String createMessage(String msgKey, Object args[]) //throws Exception
++- {
++- if (XSLTBundle == null)
++- XSLTBundle = loadResourceBundle(XSLT_ERROR_RESOURCES);
++-
++- if (XSLTBundle != null)
+++ /**
+++ * The language specific resource object for Xalan messages.
+++ */
+++ private static ListResourceBundle XSLTBundle = null;
+++ /**
+++ * The class name of the Xalan error message string table.
+++ */
+++ private static final String XSLT_ERROR_RESOURCES =
+++ "com.sun.org.apache.xalan.internal.res.XSLTErrorResources";
+++
+++ /**
+++ * Creates a message from the specified key and replacement arguments,
+++ * localized to the given locale.
+++ *
+++ * @param msgKey The key for the message text.
+++ * @param args The arguments to be used as replacement text in the message
+++ * created.
+++ *
+++ * @return The formatted message string.
+++ */
+++ public static String createMessage(String msgKey, Object args[]) //throws Exception
++ {
++- return createMsg(XSLTBundle, msgKey, args);
+++ if (XSLTBundle == null) {
+++ XSLTBundle = SecuritySupport.getResourceBundle(XSLT_ERROR_RESOURCES);
+++ }
+++
+++ if (XSLTBundle != null) {
+++ return createMsg(XSLTBundle, msgKey, args);
+++ } else {
+++ return "Could not load any resource bundles.";
+++ }
++ }
++- else
++- return "Could not load any resource bundles.";
++- }
++-
++- /**
++- * Creates a message from the specified key and replacement
++- * arguments, localized to the given locale.
++- *
++- * @param msgKey The key for the message text.
++- * @param args The arguments to be used as replacement text
++- * in the message created.
++- *
++- * @return The formatted warning string.
++- */
++- public static final String createWarning(String msgKey, Object args[]) //throws Exception
++- {
++- if (XSLTBundle == null)
++- XSLTBundle = loadResourceBundle(XSLT_ERROR_RESOURCES);
++
++- if (XSLTBundle != null)
+++ /**
+++ * Creates a message from the specified key and replacement arguments,
+++ * localized to the given locale.
+++ *
+++ * @param msgKey The key for the message text.
+++ * @param args The arguments to be used as replacement text in the message
+++ * created.
+++ *
+++ * @return The formatted warning string.
+++ */
+++ public static String createWarning(String msgKey, Object args[]) //throws Exception
++ {
++- return createMsg(XSLTBundle, msgKey, args);
+++ if (XSLTBundle == null) {
+++ XSLTBundle = SecuritySupport.getResourceBundle(XSLT_ERROR_RESOURCES);
+++ }
+++
+++ if (XSLTBundle != null) {
+++ return createMsg(XSLTBundle, msgKey, args);
+++ } else {
+++ return "Could not load any resource bundles.";
+++ }
++ }
++- else
++- return "Could not load any resource bundles.";
++- }
++ }
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java 2013-04-16 14:28:09.328150105 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java 2013-04-16 14:29:26.549394382 +0100
++@@ -2410,68 +2410,4 @@
++ public static final String QUERY_HEADER = "MUSTER ";
++
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++ }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++-}
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java 2013-04-16 14:28:09.332150170 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java 2013-04-16 14:29:26.549394382 +0100
++@@ -2409,69 +2409,4 @@
++ * @deprecated */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("es", "ES"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++ }
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java 2013-04-16 14:28:09.332150170 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java 2013-04-16 14:29:26.549394382 +0100
++@@ -2410,68 +2410,4 @@
++ public static final String QUERY_HEADER = "PATTERN ";
++
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++ }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++-}
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java 2013-04-16 14:28:09.336150235 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java 2013-04-16 14:29:26.549394382 +0100
++@@ -2409,69 +2409,4 @@
++ * @deprecated */
++ public static final String QUERY_HEADER = "MODELLO ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("it", "IT"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++ }
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java 2013-04-16 14:28:09.336150235 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java 2013-04-16 14:29:26.549394382 +0100
++@@ -2410,68 +2410,4 @@
++ public static final String QUERY_HEADER = "PATTERN ";
++
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++ }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++-}
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java 2013-04-16 14:28:09.324150042 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java 2013-04-16 14:29:26.549394382 +0100
++@@ -1446,68 +1446,4 @@
++ public static final String QUERY_HEADER = "PATTERN ";
++
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++ }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++-}
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java 2013-04-16 14:28:09.340150299 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java 2013-04-16 14:29:26.553394447 +0100
++@@ -2409,69 +2409,4 @@
++ * @deprecated */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("ko", "KR"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++ }
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java 2013-04-16 14:28:09.340150299 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java 2013-04-16 14:29:26.553394447 +0100
++@@ -2409,69 +2409,4 @@
++ * @deprecated */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("zh", "CN"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "\u65e0\u6cd5\u88c5\u5165\u4efb\u4f55\u8d44\u6e90\u5305\u3002", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++ }
++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java 2013-04-16 14:28:09.344150364 +0100
+++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java 2013-04-16 14:29:26.553394447 +0100
++@@ -2409,69 +2409,4 @@
++ * @deprecated */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XSLTErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XSLTErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XSLTErrorResources) ResourceBundle.getBundle(className,
++- new Locale("zh", "TW"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++-
++ }
++--- src/com/sun/org/apache/xalan/internal/utils/ConfigurationError.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/xalan/internal/utils/ConfigurationError.java 2013-04-16 14:29:26.553394447 +0100
++@@ -0,0 +1,61 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2001-2004 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++/*
+++ * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 02:39:54 jeffsuttor Exp $
+++ */
+++
+++package com.sun.org.apache.xalan.internal.utils;
+++
+++/**
+++ * A configuration error. This was an internal class in ObjectFactory previously
+++ */
+++public final class ConfigurationError
+++ extends Error {
+++
+++ //
+++ // Data
+++ //
+++
+++ /** Exception. */
+++ private Exception exception;
+++
+++ //
+++ // Constructors
+++ //
+++
+++ /**
+++ * Construct a new instance with the specified detail string and
+++ * exception.
+++ */
+++ ConfigurationError(String msg, Exception x) {
+++ super(msg);
+++ this.exception = x;
+++ } // <init>(String,Exception)
+++
+++ //
+++ // methods
+++ //
+++
+++ /** Returns the exception associated to this error. */
+++ public Exception getException() {
+++ return exception;
+++ } // getException():Exception
+++
+++} // class ConfigurationError
++--- src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java 2013-04-16 14:29:26.553394447 +0100
++@@ -0,0 +1,659 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2001-2004 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++/*
+++ * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 02:39:54 jeffsuttor Exp $
+++ */
+++
+++package com.sun.org.apache.xalan.internal.utils;
+++
+++import java.io.InputStream;
+++import java.io.IOException;
+++import java.io.File;
+++import java.io.FileInputStream;
+++
+++import java.util.Properties;
+++import java.io.BufferedReader;
+++import java.io.InputStreamReader;
+++
+++/**
+++ * This class is duplicated for each JAXP subpackage so keep it in sync.
+++ * It is package private and therefore is not exposed as part of the JAXP
+++ * API.
+++ * <p>
+++ * This code is designed to implement the JAXP 1.1 spec pluggability
+++ * feature and is designed to run on JDK version 1.1 and
+++ * later, and to compile on JDK 1.2 and onward.
+++ * The code also runs both as part of an unbundled jar file and
+++ * when bundled as part of the JDK.
+++ * <p>
+++ * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code>
+++ * class and modified to be used as a general utility for creating objects
+++ * dynamically.
+++ *
+++ * @version $Id: ObjectFactory.java,v 1.11 2010-11-01 04:34:25 joehw Exp $
+++ */
+++public class ObjectFactory {
+++
+++ //
+++ // Constants
+++ //
+++ private static final String XALAN_INTERNAL = "com.sun.org.apache.xalan.internal";
+++ private static final String XERCES_INTERNAL = "com.sun.org.apache.xerces.internal";
+++
+++ // name of default properties file to look for in JDK's jre/lib directory
+++ private static final String DEFAULT_PROPERTIES_FILENAME =
+++ "xalan.properties";
+++
+++ private static final String SERVICES_PATH = "META-INF/services/";
+++
+++ /** Set to true for debugging */
+++ private static final boolean DEBUG = false;
+++
+++ /** cache the contents of the xalan.properties file.
+++ * Until an attempt has been made to read this file, this will
+++ * be null; if the file does not exist or we encounter some other error
+++ * during the read, this will be empty.
+++ */
+++ private static Properties fXalanProperties = null;
+++
+++ /***
+++ * Cache the time stamp of the xalan.properties file so
+++ * that we know if it's been modified and can invalidate
+++ * the cache when necessary.
+++ */
+++ private static long fLastModified = -1;
+++
+++ //
+++ // Public static methods
+++ //
+++
+++ /**
+++ * Finds the implementation Class object in the specified order. The
+++ * specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return instance of factory, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ public static Object createObject(String factoryId, String fallbackClassName)
+++ throws ConfigurationError {
+++ return createObject(factoryId, null, fallbackClassName);
+++ } // createObject(String,String):Object
+++
+++ /**
+++ * Finds the implementation Class object in the specified order. The
+++ * specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return instance of factory, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param propertiesFilename The filename in the $java.home/lib directory
+++ * of the properties file. If none specified,
+++ * ${java.home}/lib/xalan.properties will be used.
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ static Object createObject(String factoryId,
+++ String propertiesFilename,
+++ String fallbackClassName)
+++ throws ConfigurationError
+++ {
+++ Class factoryClass = lookUpFactoryClass(factoryId,
+++ propertiesFilename,
+++ fallbackClassName);
+++
+++ if (factoryClass == null) {
+++ throw new ConfigurationError(
+++ "Provider for " + factoryId + " cannot be found", null);
+++ }
+++
+++ try{
+++ Object instance = factoryClass.newInstance();
+++ if (DEBUG) debugPrintln("created new instance of factory " + factoryId);
+++ return instance;
+++ } catch (Exception x) {
+++ throw new ConfigurationError(
+++ "Provider for factory " + factoryId
+++ + " could not be instantiated: " + x, x);
+++ }
+++ } // createObject(String,String,String):Object
+++
+++ /**
+++ * Finds the implementation Class object in the specified order. The
+++ * specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return Class object of factory, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param propertiesFilename The filename in the $java.home/lib directory
+++ * of the properties file. If none specified,
+++ * ${java.home}/lib/xalan.properties will be used.
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ public static Class lookUpFactoryClass(String factoryId)
+++ throws ConfigurationError
+++ {
+++ return lookUpFactoryClass(factoryId, null, null);
+++ } // lookUpFactoryClass(String):Class
+++
+++ /**
+++ * Finds the implementation Class object in the specified order. The
+++ * specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return Class object that provides factory service, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param propertiesFilename The filename in the $java.home/lib directory
+++ * of the properties file. If none specified,
+++ * ${java.home}/lib/xalan.properties will be used.
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ public static Class lookUpFactoryClass(String factoryId,
+++ String propertiesFilename,
+++ String fallbackClassName)
+++ throws ConfigurationError
+++ {
+++ String factoryClassName = lookUpFactoryClassName(factoryId,
+++ propertiesFilename,
+++ fallbackClassName);
+++ ClassLoader cl = findClassLoader();
+++
+++ if (factoryClassName == null) {
+++ factoryClassName = fallbackClassName;
+++ }
+++
+++ // assert(className != null);
+++ try{
+++ Class providerClass = findProviderClass(factoryClassName,
+++ cl,
+++ true);
+++ if (DEBUG) debugPrintln("created new instance of " + providerClass +
+++ " using ClassLoader: " + cl);
+++ return providerClass;
+++ } catch (ClassNotFoundException x) {
+++ throw new ConfigurationError(
+++ "Provider " + factoryClassName + " not found", x);
+++ } catch (Exception x) {
+++ throw new ConfigurationError(
+++ "Provider "+factoryClassName+" could not be instantiated: "+x,
+++ x);
+++ }
+++ } // lookUpFactoryClass(String,String,String):Class
+++
+++ /**
+++ * Finds the name of the required implementation class in the specified
+++ * order. The specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return name of class that provides factory service, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param propertiesFilename The filename in the $java.home/lib directory
+++ * of the properties file. If none specified,
+++ * ${java.home}/lib/xalan.properties will be used.
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ static String lookUpFactoryClassName(String factoryId,
+++ String propertiesFilename,
+++ String fallbackClassName)
+++ {
+++ // Use the system property first
+++ try {
+++ String systemProp = SecuritySupport.getSystemProperty(factoryId);
+++ if (systemProp != null) {
+++ if (DEBUG) debugPrintln("found system property, value=" + systemProp);
+++ return systemProp;
+++ }
+++ } catch (SecurityException se) {
+++ // Ignore and continue w/ next location
+++ }
+++
+++ // Try to read from propertiesFilename, or
+++ // $java.home/lib/xalan.properties
+++ String factoryClassName = null;
+++ // no properties file name specified; use
+++ // $JAVA_HOME/lib/xalan.properties:
+++ if (propertiesFilename == null) {
+++ File propertiesFile = null;
+++ boolean propertiesFileExists = false;
+++ try {
+++ String javah = SecuritySupport.getSystemProperty("java.home");
+++ propertiesFilename = javah + File.separator +
+++ "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;
+++ propertiesFile = new File(propertiesFilename);
+++ propertiesFileExists = SecuritySupport.getFileExists(propertiesFile);
+++ } catch (SecurityException e) {
+++ // try again...
+++ fLastModified = -1;
+++ fXalanProperties = null;
+++ }
+++
+++ synchronized (ObjectFactory.class) {
+++ boolean loadProperties = false;
+++ FileInputStream fis = null;
+++ try {
+++ // file existed last time
+++ if(fLastModified >= 0) {
+++ if(propertiesFileExists &&
+++ (fLastModified < (fLastModified = SecuritySupport.getLastModified(propertiesFile)))) {
+++ loadProperties = true;
+++ } else {
+++ // file has stopped existing...
+++ if(!propertiesFileExists) {
+++ fLastModified = -1;
+++ fXalanProperties = null;
+++ } // else, file wasn't modified!
+++ }
+++ } else {
+++ // file has started to exist:
+++ if(propertiesFileExists) {
+++ loadProperties = true;
+++ fLastModified = SecuritySupport.getLastModified(propertiesFile);
+++ } // else, nothing's changed
+++ }
+++ if(loadProperties) {
+++ // must never have attempted to read xalan.properties
+++ // before (or it's outdeated)
+++ fXalanProperties = new Properties();
+++ fis = SecuritySupport.getFileInputStream(propertiesFile);
+++ fXalanProperties.load(fis);
+++ }
+++ } catch (Exception x) {
+++ fXalanProperties = null;
+++ fLastModified = -1;
+++ // assert(x instanceof FileNotFoundException
+++ // || x instanceof SecurityException)
+++ // In both cases, ignore and continue w/ next location
+++ }
+++ finally {
+++ // try to close the input stream if one was opened.
+++ if (fis != null) {
+++ try {
+++ fis.close();
+++ }
+++ // Ignore the exception.
+++ catch (IOException exc) {}
+++ }
+++ }
+++ }
+++ if(fXalanProperties != null) {
+++ factoryClassName = fXalanProperties.getProperty(factoryId);
+++ }
+++ } else {
+++ FileInputStream fis = null;
+++ try {
+++ fis = SecuritySupport.getFileInputStream(new File(propertiesFilename));
+++ Properties props = new Properties();
+++ props.load(fis);
+++ factoryClassName = props.getProperty(factoryId);
+++ } catch (Exception x) {
+++ // assert(x instanceof FileNotFoundException
+++ // || x instanceof SecurityException)
+++ // In both cases, ignore and continue w/ next location
+++ }
+++ finally {
+++ // try to close the input stream if one was opened.
+++ if (fis != null) {
+++ try {
+++ fis.close();
+++ }
+++ // Ignore the exception.
+++ catch (IOException exc) {}
+++ }
+++ }
+++ }
+++ if (factoryClassName != null) {
+++ if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value="
+++ + factoryClassName);
+++ return factoryClassName;
+++ }
+++
+++ // Try Jar Service Provider Mechanism
+++ return findJarServiceProviderName(factoryId);
+++ } // lookUpFactoryClass(String,String):String
+++
+++ //
+++ // Private static methods
+++ //
+++
+++ /** Prints a message to standard error if debugging is enabled. */
+++ private static void debugPrintln(String msg) {
+++ if (DEBUG) {
+++ System.err.println("JAXP: " + msg);
+++ }
+++ } // debugPrintln(String)
+++
+++ /**
+++ * Figure out which ClassLoader to use. For JDK 1.2 and later use
+++ * the context ClassLoader.
+++ */
+++ public static ClassLoader findClassLoader()
+++ throws ConfigurationError
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ //this will ensure bootclassloader is used
+++ return null;
+++ }
+++
+++ // Figure out which ClassLoader to use for loading the provider
+++ // class. If there is a Context ClassLoader then use it.
+++ ClassLoader context = SecuritySupport.getContextClassLoader();
+++ ClassLoader system = SecuritySupport.getSystemClassLoader();
+++
+++ ClassLoader chain = system;
+++ while (true) {
+++ if (context == chain) {
+++ // Assert: we are on JDK 1.1 or we have no Context ClassLoader
+++ // or any Context ClassLoader in chain of system classloader
+++ // (including extension ClassLoader) so extend to widest
+++ // ClassLoader (always look in system ClassLoader if Xalan
+++ // is in boot/extension/system classpath and in current
+++ // ClassLoader otherwise); normal classloaders delegate
+++ // back to system ClassLoader first so this widening doesn't
+++ // change the fact that context ClassLoader will be consulted
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++
+++ chain = system;
+++ while (true) {
+++ if (current == chain) {
+++ // Assert: Current ClassLoader in chain of
+++ // boot/extension/system ClassLoaders
+++ return system;
+++ }
+++ if (chain == null) {
+++ break;
+++ }
+++ chain = SecuritySupport.getParentClassLoader(chain);
+++ }
+++
+++ // Assert: Current ClassLoader not in chain of
+++ // boot/extension/system ClassLoaders
+++ return current;
+++ }
+++
+++ if (chain == null) {
+++ // boot ClassLoader reached
+++ break;
+++ }
+++
+++ // Check for any extension ClassLoaders in chain up to
+++ // boot ClassLoader
+++ chain = SecuritySupport.getParentClassLoader(chain);
+++ }
+++
+++ // Assert: Context ClassLoader not in chain of
+++ // boot/extension/system ClassLoaders
+++ return context;
+++ } // findClassLoader():ClassLoader
+++
+++ /**
+++ * Create an instance of a class using the same classloader for the ObjectFactory by default
+++ * or bootclassloader when Security Manager is in place
+++ */
+++ public static Object newInstance(String className, boolean doFallback)
+++ throws ConfigurationError
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ return newInstance(className, null, doFallback);
+++ } else {
+++ return newInstance(className,
+++ findClassLoader (), doFallback);
+++ }
+++ }
+++
+++ /**
+++ * Create an instance of a class using the specified ClassLoader
+++ */
+++ static Object newInstance(String className, ClassLoader cl,
+++ boolean doFallback)
+++ throws ConfigurationError
+++ {
+++ // assert(className != null);
+++ try{
+++ Class providerClass = findProviderClass(className, cl, doFallback);
+++ Object instance = providerClass.newInstance();
+++ if (DEBUG) debugPrintln("created new instance of " + providerClass +
+++ " using ClassLoader: " + cl);
+++ return instance;
+++ } catch (ClassNotFoundException x) {
+++ throw new ConfigurationError(
+++ "Provider " + className + " not found", x);
+++ } catch (Exception x) {
+++ throw new ConfigurationError(
+++ "Provider " + className + " could not be instantiated: " + x,
+++ x);
+++ }
+++ }
+++
+++ /**
+++ * Find a Class using the same classloader for the ObjectFactory by default
+++ * or bootclassloader when Security Manager is in place
+++ */
+++ public static Class findProviderClass(String className, boolean doFallback)
+++ throws ClassNotFoundException, ConfigurationError
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ return Class.forName(className);
+++ } else {
+++ return findProviderClass (className,
+++ findClassLoader (), doFallback);
+++ }
+++ }
+++
+++ /**
+++ * Find a Class using the specified ClassLoader
+++ */
+++ static Class findProviderClass(String className, ClassLoader cl,
+++ boolean doFallback)
+++ throws ClassNotFoundException, ConfigurationError
+++ {
+++ //throw security exception if the calling thread is not allowed to access the
+++ //class. Restrict the access to the package classes as specified in java.security policy.
+++ SecurityManager security = System.getSecurityManager();
+++ try{
+++ if (security != null){
+++ if (className.startsWith(XALAN_INTERNAL) ||
+++ className.startsWith(XERCES_INTERNAL)) {
+++ cl = null;
+++ } else {
+++ final int lastDot = className.lastIndexOf(".");
+++ String packageName = className;
+++ if (lastDot != -1) packageName = className.substring(0, lastDot);
+++ security.checkPackageAccess(packageName);
+++ }
+++ }
+++ }catch(SecurityException e){
+++ throw e;
+++ }
+++
+++ Class providerClass;
+++ if (cl == null) {
+++ // XXX Use the bootstrap ClassLoader. There is no way to
+++ // load a class using the bootstrap ClassLoader that works
+++ // in both JDK 1.1 and Java 2. However, this should still
+++ // work b/c the following should be true:
+++ //
+++ // (cl == null) iff current ClassLoader == null
+++ //
+++ // Thus Class.forName(String) will use the current
+++ // ClassLoader which will be the bootstrap ClassLoader.
+++ providerClass = Class.forName(className);
+++ } else {
+++ try {
+++ providerClass = cl.loadClass(className);
+++ } catch (ClassNotFoundException x) {
+++ if (doFallback) {
+++ // Fall back to current classloader
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++ if (current == null) {
+++ providerClass = Class.forName(className);
+++ } else if (cl != current) {
+++ cl = current;
+++ providerClass = cl.loadClass(className);
+++ } else {
+++ throw x;
+++ }
+++ } else {
+++ throw x;
+++ }
+++ }
+++ }
+++
+++ return providerClass;
+++ }
+++
+++ /**
+++ * Find the name of service provider using Jar Service Provider Mechanism
+++ *
+++ * @return instance of provider class if found or null
+++ */
+++ private static String findJarServiceProviderName(String factoryId)
+++ {
+++ String serviceId = SERVICES_PATH + factoryId;
+++ InputStream is = null;
+++
+++ // First try the Context ClassLoader
+++ ClassLoader cl = findClassLoader();
+++
+++ is = SecuritySupport.getResourceAsStream(cl, serviceId);
+++
+++ // If no provider found then try the current ClassLoader
+++ if (is == null) {
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++ if (cl != current) {
+++ cl = current;
+++ is = SecuritySupport.getResourceAsStream(cl, serviceId);
+++ }
+++ }
+++
+++ if (is == null) {
+++ // No provider found
+++ return null;
+++ }
+++
+++ if (DEBUG) debugPrintln("found jar resource=" + serviceId +
+++ " using ClassLoader: " + cl);
+++
+++ // Read the service provider name in UTF-8 as specified in
+++ // the jar spec. Unfortunately this fails in Microsoft
+++ // VJ++, which does not implement the UTF-8
+++ // encoding. Theoretically, we should simply let it fail in
+++ // that case, since the JVM is obviously broken if it
+++ // doesn't support such a basic standard. But since there
+++ // are still some users attempting to use VJ++ for
+++ // development, we have dropped in a fallback which makes a
+++ // second attempt using the platform's default encoding. In
+++ // VJ++ this is apparently ASCII, which is a subset of
+++ // UTF-8... and since the strings we'll be reading here are
+++ // also primarily limited to the 7-bit ASCII range (at
+++ // least, in English versions), this should work well
+++ // enough to keep us on the air until we're ready to
+++ // officially decommit from VJ++. [Edited comment from
+++ // jkesselm]
+++ BufferedReader rd;
+++ try {
+++ rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+++ } catch (java.io.UnsupportedEncodingException e) {
+++ rd = new BufferedReader(new InputStreamReader(is));
+++ }
+++
+++ String factoryClassName = null;
+++ try {
+++ // XXX Does not handle all possible input as specified by the
+++ // Jar Service Provider specification
+++ factoryClassName = rd.readLine();
+++ } catch (IOException x) {
+++ // No provider found
+++ return null;
+++ }
+++ finally {
+++ try {
+++ // try to close the reader.
+++ rd.close();
+++ }
+++ // Ignore the exception.
+++ catch (IOException exc) {}
+++ }
+++
+++ if (factoryClassName != null &&
+++ ! "".equals(factoryClassName)) {
+++ if (DEBUG) debugPrintln("found in resource, value="
+++ + factoryClassName);
+++
+++ // Note: here we do not want to fall back to the current
+++ // ClassLoader because we want to avoid the case where the
+++ // resource file was found using one ClassLoader and the
+++ // provider class was instantiated using a different one.
+++ return factoryClassName;
+++ }
+++
+++ // No provider found
+++ return null;
+++ }
+++
+++} // class ObjectFactory
++--- src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java 2013-04-16 14:29:26.553394447 +0100
++@@ -0,0 +1,206 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2002-2004 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++/*
+++ * $Id: SecuritySupport.java,v 1.1.2.1 2005/08/01 02:08:48 jeffsuttor Exp $
+++ */
+++
+++package com.sun.org.apache.xalan.internal.utils;
+++
+++import java.io.File;
+++import java.io.FileInputStream;
+++import java.io.FileNotFoundException;
+++import java.io.InputStream;
+++
+++import java.security.AccessController;
+++import java.security.PrivilegedAction;
+++import java.security.PrivilegedActionException;
+++import java.security.PrivilegedExceptionAction;
+++import java.util.ListResourceBundle;
+++import java.util.Locale;
+++import java.util.MissingResourceException;
+++import java.util.ResourceBundle;
+++
+++/**
+++ * This class is duplicated for each subpackage so keep it in sync. It is
+++ * package private and therefore is not exposed as part of any API.
+++ *
+++ * @xerces.internal
+++ */
+++public final class SecuritySupport {
+++
+++ private static final SecuritySupport securitySupport = new SecuritySupport();
+++
+++ /**
+++ * Return an instance of this class.
+++ */
+++ public static SecuritySupport getInstance() {
+++ return securitySupport;
+++ }
+++
+++ static ClassLoader getContextClassLoader() {
+++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ try {
+++ cl = Thread.currentThread().getContextClassLoader();
+++ } catch (SecurityException ex) {
+++ }
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ static ClassLoader getSystemClassLoader() {
+++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ try {
+++ cl = ClassLoader.getSystemClassLoader();
+++ } catch (SecurityException ex) {
+++ }
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ static ClassLoader getParentClassLoader(final ClassLoader cl) {
+++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader parent = null;
+++ try {
+++ parent = cl.getParent();
+++ } catch (SecurityException ex) {
+++ }
+++
+++ // eliminate loops in case of the boot
+++ // ClassLoader returning itself as a parent
+++ return (parent == cl) ? null : parent;
+++ }
+++ });
+++ }
+++
+++ public static String getSystemProperty(final String propName) {
+++ return (String) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return System.getProperty(propName);
+++ }
+++ });
+++ }
+++
+++ public static String getSystemProperty(final String propName, final String def) {
+++ return (String) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return System.getProperty(propName, def);
+++ }
+++ });
+++ }
+++
+++ static FileInputStream getFileInputStream(final File file)
+++ throws FileNotFoundException {
+++ try {
+++ return (FileInputStream) AccessController.doPrivileged(new PrivilegedExceptionAction() {
+++ public Object run() throws FileNotFoundException {
+++ return new FileInputStream(file);
+++ }
+++ });
+++ } catch (PrivilegedActionException e) {
+++ throw (FileNotFoundException)e.getException();
+++ }
+++ }
+++
+++ /**
+++ * Return resource using the same classloader for the ObjectFactory by
+++ * default or bootclassloader when Security Manager is in place
+++ */
+++ public static InputStream getResourceAsStream(final String name) {
+++ if (System.getSecurityManager()!=null) {
+++ return getResourceAsStream(null, name);
+++ } else {
+++ return getResourceAsStream(ObjectFactory.findClassLoader(), name);
+++ }
+++ }
+++
+++ public static InputStream getResourceAsStream(final ClassLoader cl,
+++ final String name) {
+++ return (InputStream) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ InputStream ris;
+++ if (cl == null) {
+++ ris = Object.class.getResourceAsStream("/"+name);
+++ } else {
+++ ris = cl.getResourceAsStream(name);
+++ }
+++ return ris;
+++ }
+++ });
+++ }
+++
+++ /**
+++ * Gets a resource bundle using the specified base name, the default locale, and the caller's class loader.
+++ * @param bundle the base name of the resource bundle, a fully qualified class name
+++ * @return a resource bundle for the given base name and the default locale
+++ */
+++ public static ListResourceBundle getResourceBundle(String bundle) {
+++ return getResourceBundle(bundle, Locale.getDefault());
+++ }
+++
+++ /**
+++ * Gets a resource bundle using the specified base name and locale, and the caller's class loader.
+++ * @param bundle the base name of the resource bundle, a fully qualified class name
+++ * @param locale the locale for which a resource bundle is desired
+++ * @return a resource bundle for the given base name and locale
+++ */
+++ public static ListResourceBundle getResourceBundle(final String bundle, final Locale locale) {
+++ return AccessController.doPrivileged(new PrivilegedAction<ListResourceBundle>() {
+++ public ListResourceBundle run() {
+++ try {
+++ return (ListResourceBundle)ResourceBundle.getBundle(bundle, locale);
+++ } catch (MissingResourceException e) {
+++ try {
+++ return (ListResourceBundle)ResourceBundle.getBundle(bundle, new Locale("en", "US"));
+++ } catch (MissingResourceException e2) {
+++ throw new MissingResourceException(
+++ "Could not load any resource bundle by " + bundle, bundle, "");
+++ }
+++ }
+++ }
+++ });
+++ }
+++
+++ public static boolean getFileExists(final File f) {
+++ return ((Boolean) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return f.exists() ? Boolean.TRUE : Boolean.FALSE;
+++ }
+++ })).booleanValue();
+++ }
+++
+++ static long getLastModified(final File f) {
+++ return ((Long) AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return new Long(f.lastModified());
+++ }
+++ })).longValue();
+++ }
+++
+++
+++ private SecuritySupport() {
+++ }
+++}
++--- src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java 2013-04-16 14:28:09.344150364 +0100
+++++ src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java 2013-04-16 14:29:26.553394447 +0100
++@@ -22,6 +22,8 @@
++ */
++ package com.sun.org.apache.xalan.internal.xslt;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
+++
++ import java.io.File;
++ import java.io.FileWriter;
++ import java.io.PrintWriter;
++@@ -569,7 +571,7 @@
++ // Grab java version for later use
++ try
++ {
++- String javaVersion = System.getProperty("java.version");
+++ String javaVersion = SecuritySupport.getSystemProperty("java.version");
++
++ h.put("java.version", javaVersion);
++ }
++@@ -588,7 +590,7 @@
++ {
++
++ // This is present in all JVM's
++- String cp = System.getProperty("java.class.path");
+++ String cp = SecuritySupport.getSystemProperty("java.class.path");
++
++ h.put("java.class.path", cp);
++
++@@ -598,7 +600,7 @@
++ h.put(FOUNDCLASSES + "java.class.path", classpathJars);
++
++ // Also check for JDK 1.2+ type classpaths
++- String othercp = System.getProperty("sun.boot.class.path");
+++ String othercp = SecuritySupport.getSystemProperty("sun.boot.class.path");
++
++ if (null != othercp)
++ {
++@@ -612,7 +614,7 @@
++
++ //@todo NOTE: We don't actually search java.ext.dirs for
++ // *.jar files therein! This should be updated
++- othercp = System.getProperty("java.ext.dirs");
+++ othercp = SecuritySupport.getSystemProperty("java.ext.dirs");
++
++ if (null != othercp)
++ {
++--- src/com/sun/org/apache/xalan/internal/xslt/Process.java 2013-04-16 14:28:09.348150428 +0100
+++++ src/com/sun/org/apache/xalan/internal/xslt/Process.java 2013-04-16 14:29:26.553394447 +0100
++@@ -55,6 +55,7 @@
++ import com.sun.org.apache.xalan.internal.Version;
++ import com.sun.org.apache.xalan.internal.res.XSLMessages;
++ import com.sun.org.apache.xalan.internal.res.XSLTErrorResources;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ //J2SE does not support Xalan interpretive
++ /*
++@@ -178,7 +179,7 @@
++ java.io.PrintWriter diagnosticsWriter = new PrintWriter(System.err, true);
++ java.io.PrintWriter dumpWriter = diagnosticsWriter;
++ ResourceBundle resbundle =
++- (XSLMessages.loadResourceBundle(
+++ (SecuritySupport.getResourceBundle(
++ com.sun.org.apache.xml.internal.utils.res.XResourceBundle.ERROR_RESOURCES));
++ String flavor = "s2s";
++
++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java 2013-04-16 14:28:09.380150944 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java 2013-04-16 14:29:26.553394447 +0100
++@@ -400,7 +400,7 @@
++ }
++ }
++ catch (TypeCheckError e) {
++- reportError(ERROR, new ErrorMsg(e));
+++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ }
++
++@@ -420,7 +420,7 @@
++ }
++ catch (IOException e) {
++ if (_xsltc.debug()) e.printStackTrace();
++- reportError(ERROR,new ErrorMsg(e));
+++ reportError(ERROR,new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ catch (SAXException e) {
++ Throwable ex = e.getException();
++@@ -428,15 +428,15 @@
++ e.printStackTrace();
++ if (ex != null) ex.printStackTrace();
++ }
++- reportError(ERROR, new ErrorMsg(e));
+++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ catch (CompilerException e) {
++ if (_xsltc.debug()) e.printStackTrace();
++- reportError(ERROR, new ErrorMsg(e));
+++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ catch (Exception e) {
++ if (_xsltc.debug()) e.printStackTrace();
++- reportError(ERROR, new ErrorMsg(e));
+++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ return null;
++ }
++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java 2013-04-16 14:28:09.400151266 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java 2013-04-16 14:29:26.553394447 +0100
++@@ -947,7 +947,12 @@
++ "Cannot set the feature ''{0}'' on this TransformerFactory."},
++
++ {ErrorMsg.JAXP_SECUREPROCESSING_FEATURE,
++- "FEATURE_SECURE_PROCESSING: Cannot set the feature to false when security manager is present."}
+++ "FEATURE_SECURE_PROCESSING: Cannot set the feature to false when security manager is present."},
+++
+++ {ErrorMsg.DESERIALIZE_TRANSLET_ERR, "When Java security is enabled, " +
+++ "support for deserializing TemplatesImpl is disabled." +
+++ "This can be overridden by setting the jdk.xml.enableTemplatesImplDeserialization" +
+++ " system property to true."}
++ };
++ }
++ }
++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java 2013-04-16 14:28:09.420151588 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java 2013-04-16 14:29:26.553394447 +0100
++@@ -23,6 +23,7 @@
++
++ package com.sun.org.apache.xalan.internal.xsltc.compiler.util;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.text.MessageFormat;
++ import java.util.Locale;
++ import java.util.ResourceBundle;
++@@ -46,6 +47,8 @@
++ Object[] _params = null;
++ private boolean _isWarningError;
++
+++ Throwable _cause;
+++
++ // Compiler error messages
++ public static final String MULTIPLE_STYLESHEET_ERR = "MULTIPLE_STYLESHEET_ERR";
++ public static final String TEMPLATE_REDEF_ERR = "TEMPLATE_REDEF_ERR";
++@@ -157,6 +160,8 @@
++ public static final String INVALID_NCNAME_ERR = "INVALID_NCNAME_ERR";
++ public static final String INVALID_METHOD_IN_OUTPUT = "INVALID_METHOD_IN_OUTPUT";
++
+++ public static final String DESERIALIZE_TRANSLET_ERR = "DESERIALIZE_TEMPLATES_ERR";
+++
++ // All error messages are localized and are stored in resource bundles.
++ // This array and the following 4 strings are read from that bundle.
++ private static ResourceBundle _bundle;
++@@ -167,7 +172,7 @@
++ public final static String RUNTIME_ERROR_KEY = "RUNTIME_ERROR_KEY";
++
++ static {
++- _bundle = ResourceBundle.getBundle(
+++ _bundle = SecuritySupport.getResourceBundle(
++ "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages",
++ Locale.getDefault());
++ }
++@@ -177,10 +182,11 @@
++ _line = 0;
++ }
++
++- public ErrorMsg(Throwable e) {
++- _code = null;
+++ public ErrorMsg(String code, Throwable e) {
+++ _code = code;
++ _message = e.getMessage();
++ _line = 0;
+++ _cause = e;
++ }
++
++ public ErrorMsg(String message, int line) {
++@@ -232,6 +238,10 @@
++ _params[1] = param2;
++ }
++
+++ public Throwable getCause() {
+++ return _cause;
+++ }
+++
++ private String getFileName(SyntaxTreeNode node) {
++ Stylesheet stylesheet = node.getStylesheet();
++ if (stylesheet != null)
++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Util.java 2013-04-16 14:28:09.428151717 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Util.java 2013-04-16 14:29:26.553394447 +0100
++@@ -26,6 +26,7 @@
++ import java.util.StringTokenizer;
++
++ import com.sun.org.apache.bcel.internal.generic.Type;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import com.sun.org.apache.xalan.internal.xsltc.compiler.Constants;
++ import com.sun.org.apache.xml.internal.utils.XML11Char;
++
++@@ -37,7 +38,7 @@
++ private static char filesep;
++
++ static {
++- String temp = System.getProperty("file.separator", "/");
+++ String temp = SecuritySupport.getSystemProperty("file.separator", "/");
++ filesep = temp.charAt(0);
++ }
++
++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java 2013-04-16 14:28:09.396151201 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java 2013-04-16 14:29:26.553394447 +0100
++@@ -41,10 +41,12 @@
++ import java.util.jar.Manifest;
++
++ import com.sun.org.apache.bcel.internal.classfile.JavaClass;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
++ import com.sun.org.apache.xml.internal.dtm.DTM;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import org.xml.sax.InputSource;
++ import org.xml.sax.XMLReader;
++
++@@ -257,7 +259,7 @@
++ return compile(input, _className);
++ }
++ catch (IOException e) {
++- _parser.reportError(Constants.FATAL, new ErrorMsg(e));
+++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ return false;
++ }
++ }
++@@ -276,7 +278,7 @@
++ return compile(input, name);
++ }
++ catch (IOException e) {
++- _parser.reportError(Constants.FATAL, new ErrorMsg(e));
+++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ return false;
++ }
++ }
++@@ -361,11 +363,11 @@
++ }
++ catch (Exception e) {
++ /*if (_debug)*/ e.printStackTrace();
++- _parser.reportError(Constants.FATAL, new ErrorMsg(e));
+++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ catch (Error e) {
++ if (_debug) e.printStackTrace();
++- _parser.reportError(Constants.FATAL, new ErrorMsg(e));
+++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e));
++ }
++ finally {
++ _reader = null; // reset this here to be sure it is not re-used
++@@ -573,7 +575,7 @@
++ */
++ public boolean setDestDirectory(String dstDirName) {
++ final File dir = new File(dstDirName);
++- if (dir.exists() || dir.mkdirs()) {
+++ if (SecuritySupport.getFileExists(dir) || dir.mkdirs()) {
++ _destDir = dir;
++ return true;
++ }
++@@ -746,7 +748,7 @@
++ String parentDir = outFile.getParent();
++ if (parentDir != null) {
++ File parentFile = new File(parentDir);
++- if (!parentFile.exists())
+++ if (!SecuritySupport.getFileExists(parentFile))
++ parentFile.mkdirs();
++ }
++ }
++--- src/com/sun/org/apache/xalan/internal/xsltc/dom/NodeSortRecord.java 2013-04-16 14:28:09.444151975 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/dom/NodeSortRecord.java 2013-04-16 14:29:26.553394447 +0100
++@@ -32,6 +32,7 @@
++ import com.sun.org.apache.xalan.internal.xsltc.TransletException;
++ import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
++ import com.sun.org.apache.xml.internal.utils.StringComparable;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ /**
++ * Base class for sort records containing application specific sort keys
++@@ -111,7 +112,7 @@
++ try {
++ // -- W. Eliot Kimber (eliot@isogen.com)
++ colFactClassname =
++- System.getProperty("com.sun.org.apache.xalan.internal.xsltc.COLLATOR_FACTORY");
+++ SecuritySupport.getSystemProperty("com.sun.org.apache.xalan.internal.xsltc.COLLATOR_FACTORY");
++ }
++ catch (SecurityException e) {
++ // If we can't read the propery, just use default collator
++--- src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java 2013-04-16 14:28:09.448152039 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java 2013-04-16 14:29:26.553394447 +0100
++@@ -23,6 +23,7 @@
++
++ package com.sun.org.apache.xalan.internal.xsltc.runtime;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.text.DecimalFormat;
++ import java.text.DecimalFormatSymbols;
++ import java.text.FieldPosition;
++@@ -1518,7 +1519,7 @@
++
++ static {
++ String resource = "com.sun.org.apache.xalan.internal.xsltc.runtime.ErrorMessages";
++- m_bundle = ResourceBundle.getBundle(resource);
+++ m_bundle = SecuritySupport.getResourceBundle(resource);
++ }
++
++ /**
++--- src/com/sun/org/apache/xalan/internal/xsltc/runtime/output/WriterOutputBuffer.java 2013-04-16 14:28:09.456152168 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/runtime/output/WriterOutputBuffer.java 2013-04-16 14:29:26.557394511 +0100
++@@ -23,6 +23,7 @@
++
++ package com.sun.org.apache.xalan.internal.xsltc.runtime.output;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.io.BufferedWriter;
++ import java.io.IOException;
++ import java.io.Writer;
++@@ -36,7 +37,7 @@
++
++ static {
++ // Set a larger buffer size for Solaris
++- final String osName = System.getProperty("os.name");
+++ final String osName = SecuritySupport.getSystemProperty("os.name");
++ if (osName.equalsIgnoreCase("solaris")) {
++ BUFFER_SIZE = 32 * KB;
++ }
++--- src/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java 2013-04-16 14:28:09.460152233 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java 2013-04-16 14:29:26.557394511 +0100
++@@ -42,6 +42,7 @@
++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
++ import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
++ import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ /**
++ * @author Morten Jorgensen
++@@ -51,6 +52,8 @@
++ */
++ public final class TemplatesImpl implements Templates, Serializable {
++ static final long serialVersionUID = 673094361519270707L;
+++ public final static String DESERIALIZE_TRANSLET = "jdk.xml.enableTemplatesImplDeserialization";
+++
++ /**
++ * Name of the superclass of all translets. This is needed to
++ * determine which, among all classes comprising a translet,
++@@ -181,6 +184,15 @@
++ private void readObject(ObjectInputStream is)
++ throws IOException, ClassNotFoundException
++ {
+++ SecurityManager security = System.getSecurityManager();
+++ if (security != null){
+++ String temp = SecuritySupport.getSystemProperty(DESERIALIZE_TRANSLET);
+++ if (temp == null || !(temp.length()==0 || temp.equalsIgnoreCase("true"))) {
+++ ErrorMsg err = new ErrorMsg(ErrorMsg.DESERIALIZE_TRANSLET_ERR);
+++ throw new UnsupportedOperationException(err.toString());
+++ }
+++ }
+++
++ is.defaultReadObject();
++ if (is.readBoolean()) {
++ _uriResolver = (URIResolver) is.readObject();
++--- src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java 2013-04-16 14:28:09.460152233 +0100
+++++ src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java 2013-04-16 14:29:26.557394511 +0100
++@@ -69,7 +69,7 @@
++ import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC;
++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
++ import com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager;
++-
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ import org.xml.sax.InputSource;
++ import org.xml.sax.XMLFilter;
++@@ -839,8 +839,14 @@
++ // Check that the transformation went well before returning
++ if (bytecodes == null) {
++
++- ErrorMsg err = new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR);
++- TransformerConfigurationException exc = new TransformerConfigurationException(err.toString());
+++ Vector errs = xsltc.getErrors();
+++ ErrorMsg err = null;
+++ if (errs != null) {
+++ err = (ErrorMsg)errs.get(errs.size()-1);
+++ } else {
+++ err = new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR);
+++ }
+++ TransformerConfigurationException exc = new TransformerConfigurationException(err.toString(), err.getCause());
++
++ // Pass compiler errors to the error listener
++ if (_errorListener != null) {
++@@ -1187,7 +1193,7 @@
++ // Find the parent directory of the translet.
++ String transletParentDir = transletFile.getParent();
++ if (transletParentDir == null)
++- transletParentDir = System.getProperty("user.dir");
+++ transletParentDir = SecuritySupport.getSystemProperty("user.dir");
++
++ File transletParentFile = new File(transletParentDir);
++
++--- src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java 2013-04-16 14:28:09.472152426 +0100
+++++ src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,10 +20,10 @@
++
++
++ package com.sun.org.apache.xerces.internal.dom;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++-import java.util.PropertyResourceBundle;
++
++ /**
++ * Used to format DOM error messages, using the system locale.
++@@ -31,6 +31,7 @@
++ * @xerces.internal
++ *
++ * @author Sandy Gao, IBM
+++ * @version $Id: DOMMessageFormatter.java,v 1.6 2010-11-01 04:39:38 joehw Exp $
++ */
++ public class DOMMessageFormatter {
++ public static final String DOM_DOMAIN = "http://www.w3.org/dom/DOMTR";
++@@ -122,13 +123,13 @@
++ */
++ public static void init(){
++ if (locale != null) {
++- domResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages", locale);
++- serResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages", locale);
++- xmlResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
+++ domResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages", locale);
+++ serResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages", locale);
+++ xmlResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
++ }else{
++- domResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages");
++- serResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages");
++- xmlResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
+++ domResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages");
+++ serResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages");
+++ xmlResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
++ }
++ }
++
++--- src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java 2013-04-16 14:28:09.532153393 +0100
+++++ src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,6 +20,7 @@
++
++ package com.sun.org.apache.xerces.internal.impl.dv;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.ResourceBundle;
++ import java.util.PropertyResourceBundle;
++ import java.util.MissingResourceException;
++@@ -34,6 +35,7 @@
++ *
++ * @author Sandy Gao, IBM
++ *
+++ * @version $Id: DatatypeException.java,v 1.6 2010-11-01 04:39:43 joehw Exp $
++ */
++ public class DatatypeException extends Exception {
++
++@@ -84,7 +86,7 @@
++ */
++ public String getMessage() {
++ ResourceBundle resourceBundle = null;
++- resourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages");
+++ resourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages");
++ if (resourceBundle == null)
++ throw new MissingResourceException("Property file not found!", "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", key);
++
++--- src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java 2013-04-16 14:28:09.552153715 +0100
+++++ src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,12 +20,11 @@
++
++ package com.sun.org.apache.xerces.internal.impl.msg;
++
+++import com.sun.org.apache.xerces.internal.util.MessageFormatter;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++-import java.util.PropertyResourceBundle;
++-
++-import com.sun.org.apache.xerces.internal.util.MessageFormatter;
++
++ /**
++ * XMLMessageFormatter provides error messages for the XML 1.0 Recommendation and for
++@@ -71,12 +70,12 @@
++
++ if (fResourceBundle == null || locale != fLocale) {
++ if (locale != null) {
++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
+++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
++ // memorize the most-recent locale
++ fLocale = locale;
++ }
++ if (fResourceBundle == null)
++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
+++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
++ }
++
++ // format message
++--- src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java 2013-04-16 14:28:09.504152942 +0100
+++++ src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java 2013-04-16 14:29:26.557394511 +0100
++@@ -52,6 +52,7 @@
++ import com.sun.org.apache.xerces.internal.xni.XNIException;
++ import com.sun.org.apache.xerces.internal.xni.parser.*;
++ import com.sun.org.apache.xerces.internal.impl.Constants;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import com.sun.xml.internal.stream.Entity;
++ import com.sun.org.apache.xerces.internal.xni.Augmentations;
++
++@@ -1811,7 +1812,7 @@
++ // get the user.dir property
++ String userDir = "";
++ try {
++- userDir = System.getProperty("user.dir");
+++ userDir = SecuritySupport.getSystemProperty("user.dir");
++ }
++ catch (SecurityException se) {
++ }
++@@ -2155,9 +2156,6 @@
++ private static String expandSystemIdStrictOff(String systemId, String baseSystemId)
++ throws URI.MalformedURIException {
++
++- systemId = escapeNonUSAscii(systemId);
++- baseSystemId = escapeNonUSAscii(baseSystemId);
++-
++ URI systemURI = new URI(systemId, true);
++ // If it's already an absolute one, return it
++ if (systemURI.isAbsoluteURI()) {
++@@ -2623,64 +2621,6 @@
++
++ } // fixURI(String):String
++
++- /**
++- * Escape invalid URI characters.
++- *
++- * Passed a URI that contains invalid characters (like spaces, non-ASCII Unicode characters, and the like),
++- * this function percent encodes the invalid characters per the URI specification (i.e., as a sequence of
++- * %-encoded UTF-8 octets).
++- *
++- * N.B. There are two problems. If the URI contains a '%' character, that might be an indication that
++- * the URI has already been escaped by the author, or it might be an invalid '%'. In the former case,
++- * it's important not to escape it, or we'll wind up with invalid, doubly-escaped '%'s. In the latter,
++- * the URI is broken if we don't encode it. Similarly, a '#' character might be the start of a fragment
++- * identifier or it might be an invalid '#'.
++- *
++- * Given that the former is vastly more likely than the latter in each case (most users are familiar with
++- * the magic status of '%' and '#' and they occur relatively infrequently in filenames, and if the user parses
++- * a proper Java File, we will already have %-escaped the URI), we simply assume that %'s and #'s are legit.
++- *
++- * Very rarely, we may be wrong. If so, tell the user to fix the clearly broken URI.
++- */
++- protected static String escapeNonUSAscii(String str) {
++- if (str == null) {
++- return str;
++- }
++-
++- // get UTF-8 bytes for the string
++- StringBuffer buffer = new StringBuffer();
++- byte[] bytes = null;
++- byte b;
++- try {
++- bytes = str.getBytes("UTF-8");
++- } catch (java.io.UnsupportedEncodingException e) {
++- // should never happen
++- return str;
++- }
++- int len = bytes.length;
++- int ch;
++-
++- // for each byte
++- for (int i = 0; i < len; i++) {
++- b = bytes[i];
++- // for non-ascii character: make it positive, then escape
++- if (b < 0) {
++- ch = b + 256;
++- buffer.append('%');
++- buffer.append(gHexChs[ch >> 4]);
++- buffer.append(gHexChs[ch & 0xf]);
++- }
++- else if (b != '%' && b != '#' && gNeedEscaping[b]) {
++- buffer.append('%');
++- buffer.append(gAfterEscaping1[b]);
++- buffer.append(gAfterEscaping2[b]);
++- }
++- else {
++- buffer.append((char)b);
++- }
++- }
++- return buffer.toString();
++- }
++
++ //
++ // Package visible methods
++--- src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java 2013-04-16 14:28:09.560153844 +0100
+++++ src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,6 +20,7 @@
++
++ package com.sun.org.apache.xerces.internal.impl.xpath.regex;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++@@ -94,10 +95,10 @@
++ public void setLocale(Locale locale) {
++ try {
++ if (locale != null) {
++- this.resources = ResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message", locale);
+++ this.resources = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message", locale);
++ }
++ else {
++- this.resources = ResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message");
+++ this.resources = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message");
++ }
++ }
++ catch (MissingResourceException mre) {
++--- src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java 2013-04-16 14:28:09.572154037 +0100
+++++ src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,11 +20,11 @@
++
++ package com.sun.org.apache.xerces.internal.impl.xs;
++
+++import com.sun.org.apache.xerces.internal.util.MessageFormatter;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++-import java.util.PropertyResourceBundle;
++-import com.sun.org.apache.xerces.internal.util.MessageFormatter;
++
++
++ /**
++@@ -34,6 +34,7 @@
++ * @xerces.internal
++ *
++ * @author Elena Litani, IBM
+++ * @version $Id: XSMessageFormatter.java,v 1.6 2010-11-01 04:39:55 joehw Exp $
++ */
++ public class XSMessageFormatter implements MessageFormatter {
++ /**
++@@ -66,12 +67,12 @@
++
++ if (fResourceBundle == null || locale != fLocale) {
++ if (locale != null) {
++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", locale);
+++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", locale);
++ // memorize the most-recent locale
++ fLocale = locale;
++ }
++ if (fResourceBundle == null)
++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages");
+++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages");
++ }
++
++ String msg = fResourceBundle.getString(key);
++--- src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java 2013-04-16 14:28:09.600154489 +0100
+++++ src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,15 +20,16 @@
++
++ package com.sun.org.apache.xerces.internal.jaxp.validation;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++-import java.util.PropertyResourceBundle;
++
++ /**
++ * <p>Used to format JAXP Validation API error messages using a specified locale.</p>
++ *
++ * @author Michael Glavassevich, IBM
+++ * @version $Id: JAXPValidationMessageFormatter.java,v 1.5 2010-11-01 04:40:08 joehw Exp $
++ */
++ final class JAXPValidationMessageFormatter {
++
++@@ -54,11 +55,11 @@
++ ResourceBundle resourceBundle = null;
++ if (locale != null) {
++ resourceBundle =
++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages", locale);
+++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages", locale);
++ }
++ else {
++ resourceBundle =
++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages");
+++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages");
++ }
++
++ // format message
++--- src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java 2013-04-16 14:28:09.616154746 +0100
+++++ src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,15 +20,16 @@
++
++ package com.sun.org.apache.xerces.internal.util;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++-import java.util.PropertyResourceBundle;
++ import java.util.ResourceBundle;
++
++ /**
++ * <p>Used to format JAXP 1.3 Datatype API error messages using a specified locale.</p>
++ *
++ * @author Neeraj Bajaj, Sun Microsystems
+++ * @version $Id: DatatypeMessageFormatter.java,v 1.6 2010-11-01 04:40:14 joehw Exp $
++ */
++ public class DatatypeMessageFormatter {
++
++@@ -56,11 +57,11 @@
++ ResourceBundle resourceBundle = null;
++ if (locale != null) {
++ resourceBundle =
++- PropertyResourceBundle.getBundle(BASE_NAME, locale);
+++ SecuritySupport.getResourceBundle(BASE_NAME, locale);
++ }
++ else {
++ resourceBundle =
++- PropertyResourceBundle.getBundle(BASE_NAME);
+++ SecuritySupport.getResourceBundle(BASE_NAME);
++ }
++
++ // format message
++--- src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java 2013-04-16 14:28:09.620154811 +0100
+++++ src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -19,16 +19,17 @@
++ */
++ package com.sun.org.apache.xerces.internal.util;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++-import java.util.PropertyResourceBundle;
++
++ /**
++ * Used to format SAX error messages using a specified locale.
++ *
++ * @author Michael Glavassevich, IBM
++ *
+++ * @version $Id: SAXMessageFormatter.java,v 1.6 2010-11-01 04:40:14 joehw Exp $
++ */
++ public class SAXMessageFormatter {
++
++@@ -54,11 +55,11 @@
++ ResourceBundle resourceBundle = null;
++ if (locale != null) {
++ resourceBundle =
++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages", locale);
+++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages", locale);
++ }
++ else {
++ resourceBundle =
++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages");
+++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages");
++ }
++
++ // format message
++--- src/com/sun/org/apache/xerces/internal/util/SecurityManager.java 2013-04-16 14:28:09.620154811 +0100
+++++ src/com/sun/org/apache/xerces/internal/util/SecurityManager.java 2013-04-16 14:29:26.557394511 +0100
++@@ -61,6 +61,8 @@
++
++ package com.sun.org.apache.xerces.internal.util;
++ import com.sun.org.apache.xerces.internal.impl.Constants;
+++import java.security.AccessController;
+++import java.security.PrivilegedAction;
++ /**
++ * This class is a container for parser settings that relate to
++ * security, or more specifically, it is intended to be used to prevent denial-of-service
++@@ -77,6 +79,7 @@
++ *
++ * @author Neil Graham, IBM
++ *
+++ * @version $Id: SecurityManager.java,v 1.5 2010-11-01 04:40:14 joehw Exp $
++ */
++ public final class SecurityManager {
++
++@@ -176,41 +179,48 @@
++
++ private void readSystemProperties(){
++
++- //TODO: also read SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT
++- try {
++- String value = System.getProperty(Constants.ENTITY_EXPANSION_LIMIT);
++- if(value != null && !value.equals("")){
++- entityExpansionLimit = Integer.parseInt(value);
++- if (entityExpansionLimit < 0)
++- entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT;
++- }
++- else
++- entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT;
++- }catch(Exception ex){}
++-
++- try {
++- String value = System.getProperty(Constants.MAX_OCCUR_LIMIT);
++- if(value != null && !value.equals("")){
++- maxOccurLimit = Integer.parseInt(value);
++- if (maxOccurLimit < 0)
++- maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT;
++- }
++- else
++- maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT;
++- }catch(Exception ex){}
++-
++- try {
++- String value = System.getProperty(Constants.SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT);
++- if(value != null && !value.equals("")){
++- fElementAttributeLimit = Integer.parseInt(value);
++- if ( fElementAttributeLimit < 0)
++- fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT;
++- }
++- else
++- fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT;
+++ //TODO: also read SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT
+++ try {
+++ String value = getSystemProperty(Constants.ENTITY_EXPANSION_LIMIT);
+++ if(value != null && !value.equals("")){
+++ entityExpansionLimit = Integer.parseInt(value);
+++ if (entityExpansionLimit < 0)
+++ entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT;
+++ }
+++ else
+++ entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT;
+++ }catch(Exception ex){}
+++
+++ try {
+++ String value = getSystemProperty(Constants.MAX_OCCUR_LIMIT);
+++ if(value != null && !value.equals("")){
+++ maxOccurLimit = Integer.parseInt(value);
+++ if (maxOccurLimit < 0)
+++ maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT;
+++ }
+++ else
+++ maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT;
+++ }catch(Exception ex){}
+++
+++ try {
+++ String value = getSystemProperty(Constants.SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT);
+++ if(value != null && !value.equals("")){
+++ fElementAttributeLimit = Integer.parseInt(value);
+++ if ( fElementAttributeLimit < 0)
+++ fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT;
+++ }
+++ else
+++ fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT;
++
++ }catch(Exception ex){}
++
++ }
++
+++ private String getSystemProperty(final String propName) {
+++ return AccessController.doPrivileged(new PrivilegedAction<String>() {
+++ public String run() {
+++ return System.getProperty(propName);
+++ }
+++ });
+++ }
++ } // class SecurityManager
++--- src/com/sun/org/apache/xerces/internal/utils/ConfigurationError.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/xerces/internal/utils/ConfigurationError.java 2013-04-16 14:29:26.557394511 +0100
++@@ -0,0 +1,58 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2001-2005 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++
+++package com.sun.org.apache.xerces.internal.utils;
+++
+++/**
+++ * A configuration error. This was an internal class in ObjectFactory previously
+++ */
+++public final class ConfigurationError
+++ extends Error {
+++
+++ //
+++ // Data
+++ //
+++
+++ /** Exception. */
+++ private Exception exception;
+++
+++ //
+++ // Constructors
+++ //
+++
+++ /**
+++ * Construct a new instance with the specified detail string and
+++ * exception.
+++ */
+++ ConfigurationError(String msg, Exception x) {
+++ super(msg);
+++ this.exception = x;
+++ } // <init>(String,Exception)
+++
+++ //
+++ // methods
+++ //
+++
+++ /** Returns the exception associated to this error. */
+++ public Exception getException() {
+++ return exception;
+++ } // getException():Exception
+++
+++} // class ConfigurationError
++--- src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java 2013-04-16 14:29:26.557394511 +0100
++@@ -0,0 +1,436 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2001-2005 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++
+++package com.sun.org.apache.xerces.internal.utils;
+++
+++import java.io.InputStream;
+++import java.io.IOException;
+++import java.io.File;
+++import java.io.FileInputStream;
+++
+++import java.util.Properties;
+++import java.io.BufferedReader;
+++import java.io.InputStreamReader;
+++
+++/**
+++ * This class is duplicated for each JAXP subpackage so keep it in sync.
+++ * It is package private and therefore is not exposed as part of the JAXP
+++ * API.
+++ * <p>
+++ * This code is designed to implement the JAXP 1.1 spec pluggability
+++ * feature and is designed to run on JDK version 1.1 and
+++ * later, and to compile on JDK 1.2 and onward.
+++ * The code also runs both as part of an unbundled jar file and
+++ * when bundled as part of the JDK.
+++ * <p>
+++ *
+++ * @version $Id: ObjectFactory.java,v 1.6 2010/04/23 01:44:34 joehw Exp $
+++ */
+++public final class ObjectFactory {
+++
+++ //
+++ // Constants
+++ //
+++ private static final String DEFAULT_INTERNAL_CLASSES = "com.sun.org.apache.";
+++
+++ // name of default properties file to look for in JDK's jre/lib directory
+++ private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties";
+++
+++ /** Set to true for debugging */
+++ private static final boolean DEBUG = isDebugEnabled();
+++
+++ /**
+++ * Default columns per line.
+++ */
+++ private static final int DEFAULT_LINE_LENGTH = 80;
+++
+++ /** cache the contents of the xerces.properties file.
+++ * Until an attempt has been made to read this file, this will
+++ * be null; if the file does not exist or we encounter some other error
+++ * during the read, this will be empty.
+++ */
+++ private static Properties fXercesProperties = null;
+++
+++ /***
+++ * Cache the time stamp of the xerces.properties file so
+++ * that we know if it's been modified and can invalidate
+++ * the cache when necessary.
+++ */
+++ private static long fLastModified = -1;
+++
+++ //
+++ // static methods
+++ //
+++
+++ /**
+++ * Finds the implementation Class object in the specified order. The
+++ * specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return Class object of factory, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ public static Object createObject(String factoryId, String fallbackClassName)
+++ throws ConfigurationError {
+++ return createObject(factoryId, null, fallbackClassName);
+++ } // createObject(String,String):Object
+++
+++ /**
+++ * Finds the implementation Class object in the specified order. The
+++ * specified order is the following:
+++ * <ol>
+++ * <li>query the system property using <code>System.getProperty</code>
+++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
+++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file
+++ * <li>use fallback classname
+++ * </ol>
+++ *
+++ * @return Class object of factory, never null
+++ *
+++ * @param factoryId Name of the factory to find, same as
+++ * a property name
+++ * @param propertiesFilename The filename in the $java.home/lib directory
+++ * of the properties file. If none specified,
+++ * ${java.home}/lib/xerces.properties will be used.
+++ * @param fallbackClassName Implementation class name, if nothing else
+++ * is found. Use null to mean no fallback.
+++ *
+++ * @exception ObjectFactory.ConfigurationError
+++ */
+++ public static Object createObject(String factoryId,
+++ String propertiesFilename,
+++ String fallbackClassName)
+++ throws ConfigurationError
+++ {
+++ if (DEBUG) debugPrintln("debug is on");
+++
+++ ClassLoader cl = findClassLoader();
+++
+++ // Use the system property first
+++ try {
+++ String systemProp = SecuritySupport.getSystemProperty(factoryId);
+++ if (systemProp != null && systemProp.length() > 0) {
+++ if (DEBUG) debugPrintln("found system property, value=" + systemProp);
+++ return newInstance(systemProp, cl, true);
+++ }
+++ } catch (SecurityException se) {
+++ // Ignore and continue w/ next location
+++ }
+++
+++ // JAXP specific change
+++ // always use fallback class to avoid the expense of constantly
+++ // "stat"ing a non-existent "xerces.properties" and jar SPI entry
+++ // see CR 6400863: Expensive creating of SAX parser in Mustang
+++ if (fallbackClassName == null) {
+++ throw new ConfigurationError(
+++ "Provider for " + factoryId + " cannot be found", null);
+++ }
+++
+++ if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName);
+++ return newInstance(fallbackClassName, cl, true);
+++
+++ } // createObject(String,String,String):Object
+++
+++ //
+++ // Private static methods
+++ //
+++
+++ /** Returns true if debug has been enabled. */
+++ private static boolean isDebugEnabled() {
+++ try {
+++ String val = SecuritySupport.getSystemProperty("xerces.debug");
+++ // Allow simply setting the prop to turn on debug
+++ return (val != null && (!"false".equals(val)));
+++ }
+++ catch (SecurityException se) {}
+++ return false;
+++ } // isDebugEnabled()
+++
+++ /** Prints a message to standard error if debugging is enabled. */
+++ private static void debugPrintln(String msg) {
+++ if (DEBUG) {
+++ System.err.println("XERCES: " + msg);
+++ }
+++ } // debugPrintln(String)
+++
+++ /**
+++ * Figure out which ClassLoader to use. For JDK 1.2 and later use
+++ * the context ClassLoader.
+++ */
+++ public static ClassLoader findClassLoader()
+++ throws ConfigurationError
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ //this will ensure bootclassloader is used
+++ return null;
+++ }
+++ // Figure out which ClassLoader to use for loading the provider
+++ // class. If there is a Context ClassLoader then use it.
+++ ClassLoader context = SecuritySupport.getContextClassLoader();
+++ ClassLoader system = SecuritySupport.getSystemClassLoader();
+++
+++ ClassLoader chain = system;
+++ while (true) {
+++ if (context == chain) {
+++ // Assert: we are on JDK 1.1 or we have no Context ClassLoader
+++ // or any Context ClassLoader in chain of system classloader
+++ // (including extension ClassLoader) so extend to widest
+++ // ClassLoader (always look in system ClassLoader if Xerces
+++ // is in boot/extension/system classpath and in current
+++ // ClassLoader otherwise); normal classloaders delegate
+++ // back to system ClassLoader first so this widening doesn't
+++ // change the fact that context ClassLoader will be consulted
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++
+++ chain = system;
+++ while (true) {
+++ if (current == chain) {
+++ // Assert: Current ClassLoader in chain of
+++ // boot/extension/system ClassLoaders
+++ return system;
+++ }
+++ if (chain == null) {
+++ break;
+++ }
+++ chain = SecuritySupport.getParentClassLoader(chain);
+++ }
+++
+++ // Assert: Current ClassLoader not in chain of
+++ // boot/extension/system ClassLoaders
+++ return current;
+++ }
+++
+++ if (chain == null) {
+++ // boot ClassLoader reached
+++ break;
+++ }
+++
+++ // Check for any extension ClassLoaders in chain up to
+++ // boot ClassLoader
+++ chain = SecuritySupport.getParentClassLoader(chain);
+++ };
+++
+++ // Assert: Context ClassLoader not in chain of
+++ // boot/extension/system ClassLoaders
+++ return context;
+++ } // findClassLoader():ClassLoader
+++
+++ /**
+++ * Create an instance of a class using the same classloader for the ObjectFactory by default
+++ * or bootclassloader when Security Manager is in place
+++ */
+++ public static Object newInstance(String className, boolean doFallback)
+++ throws ConfigurationError
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ return newInstance(className, null, doFallback);
+++ } else {
+++ return newInstance(className,
+++ findClassLoader (), doFallback);
+++ }
+++ }
+++
+++ /**
+++ * Create an instance of a class using the specified ClassLoader
+++ */
+++ public static Object newInstance(String className, ClassLoader cl,
+++ boolean doFallback)
+++ throws ConfigurationError
+++ {
+++ // assert(className != null);
+++ try{
+++ Class providerClass = findProviderClass(className, cl, doFallback);
+++ Object instance = providerClass.newInstance();
+++ if (DEBUG) debugPrintln("created new instance of " + providerClass +
+++ " using ClassLoader: " + cl);
+++ return instance;
+++ } catch (ClassNotFoundException x) {
+++ throw new ConfigurationError(
+++ "Provider " + className + " not found", x);
+++ } catch (Exception x) {
+++ throw new ConfigurationError(
+++ "Provider " + className + " could not be instantiated: " + x,
+++ x);
+++ }
+++ }
+++
+++ /**
+++ * Find a Class using the same classloader for the ObjectFactory by default
+++ * or bootclassloader when Security Manager is in place
+++ */
+++ public static Class findProviderClass(String className, boolean doFallback)
+++ throws ClassNotFoundException, ConfigurationError
+++ {
+++ if (System.getSecurityManager()!=null) {
+++ return Class.forName(className);
+++ } else {
+++ return findProviderClass (className,
+++ findClassLoader (), doFallback);
+++ }
+++ }
+++ /**
+++ * Find a Class using the specified ClassLoader
+++ */
+++ public static Class findProviderClass(String className, ClassLoader cl,
+++ boolean doFallback)
+++ throws ClassNotFoundException, ConfigurationError
+++ {
+++ //throw security exception if the calling thread is not allowed to access the package
+++ //restrict the access to package as speicified in java.security policy
+++ SecurityManager security = System.getSecurityManager();
+++ if (security != null) {
+++ if (className.startsWith(DEFAULT_INTERNAL_CLASSES)) {
+++ cl = null;
+++ } else {
+++ final int lastDot = className.lastIndexOf(".");
+++ String packageName = className;
+++ if (lastDot != -1) packageName = className.substring(0, lastDot);
+++ security.checkPackageAccess(packageName);
+++ }
+++ }
+++ Class providerClass;
+++ if (cl == null) {
+++ //use the bootstrap ClassLoader.
+++ providerClass = Class.forName(className);
+++ } else {
+++ try {
+++ providerClass = cl.loadClass(className);
+++ } catch (ClassNotFoundException x) {
+++ if (doFallback) {
+++ // Fall back to current classloader
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++ if (current == null) {
+++ providerClass = Class.forName(className);
+++ } else if (cl != current) {
+++ cl = current;
+++ providerClass = cl.loadClass(className);
+++ } else {
+++ throw x;
+++ }
+++ } else {
+++ throw x;
+++ }
+++ }
+++ }
+++
+++ return providerClass;
+++ }
+++
+++ /*
+++ * Try to find provider using Jar Service Provider Mechanism
+++ *
+++ * @return instance of provider class if found or null
+++ */
+++ private static Object findJarServiceProvider(String factoryId)
+++ throws ConfigurationError
+++ {
+++ String serviceId = "META-INF/services/" + factoryId;
+++ InputStream is = null;
+++
+++ // First try the Context ClassLoader
+++ ClassLoader cl = findClassLoader();
+++
+++ is = SecuritySupport.getResourceAsStream(cl, serviceId);
+++
+++ // If no provider found then try the current ClassLoader
+++ if (is == null) {
+++ ClassLoader current = ObjectFactory.class.getClassLoader();
+++ if (cl != current) {
+++ cl = current;
+++ is = SecuritySupport.getResourceAsStream(cl, serviceId);
+++ }
+++ }
+++
+++ if (is == null) {
+++ // No provider found
+++ return null;
+++ }
+++
+++ if (DEBUG) debugPrintln("found jar resource=" + serviceId +
+++ " using ClassLoader: " + cl);
+++
+++ // Read the service provider name in UTF-8 as specified in
+++ // the jar spec. Unfortunately this fails in Microsoft
+++ // VJ++, which does not implement the UTF-8
+++ // encoding. Theoretically, we should simply let it fail in
+++ // that case, since the JVM is obviously broken if it
+++ // doesn't support such a basic standard. But since there
+++ // are still some users attempting to use VJ++ for
+++ // development, we have dropped in a fallback which makes a
+++ // second attempt using the platform's default encoding. In
+++ // VJ++ this is apparently ASCII, which is a subset of
+++ // UTF-8... and since the strings we'll be reading here are
+++ // also primarily limited to the 7-bit ASCII range (at
+++ // least, in English versions), this should work well
+++ // enough to keep us on the air until we're ready to
+++ // officially decommit from VJ++. [Edited comment from
+++ // jkesselm]
+++ BufferedReader rd;
+++ try {
+++ rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
+++ } catch (java.io.UnsupportedEncodingException e) {
+++ rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
+++ }
+++
+++ String factoryClassName = null;
+++ try {
+++ // XXX Does not handle all possible input as specified by the
+++ // Jar Service Provider specification
+++ factoryClassName = rd.readLine();
+++ } catch (IOException x) {
+++ // No provider found
+++ return null;
+++ }
+++ finally {
+++ try {
+++ // try to close the reader.
+++ rd.close();
+++ }
+++ // Ignore the exception.
+++ catch (IOException exc) {}
+++ }
+++
+++ if (factoryClassName != null &&
+++ ! "".equals(factoryClassName)) {
+++ if (DEBUG) debugPrintln("found in resource, value="
+++ + factoryClassName);
+++
+++ // Note: here we do not want to fall back to the current
+++ // ClassLoader because we want to avoid the case where the
+++ // resource file was found using one ClassLoader and the
+++ // provider class was instantiated using a different one.
+++ return newInstance(factoryClassName, cl, false);
+++ }
+++
+++ // No provider found
+++ return null;
+++ }
+++
+++} // class ObjectFactory
++--- src/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java 2013-04-16 14:29:26.557394511 +0100
++@@ -0,0 +1,199 @@
+++/*
+++ * reserved comment block
+++ * DO NOT REMOVE OR ALTER!
+++ */
+++/*
+++ * Copyright 2002,2004 The Apache Software Foundation.
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ */
+++
+++package com.sun.org.apache.xerces.internal.utils;
+++
+++import java.io.File;
+++import java.io.FileInputStream;
+++import java.io.FileNotFoundException;
+++import java.io.InputStream;
+++
+++import java.security.AccessController;
+++import java.security.PrivilegedAction;
+++import java.security.PrivilegedActionException;
+++import java.security.PrivilegedExceptionAction;
+++import java.util.Locale;
+++import java.util.MissingResourceException;
+++import java.util.PropertyResourceBundle;
+++import java.util.ResourceBundle;
+++
+++/**
+++ * This class is duplicated for each subpackage so keep it in sync.
+++ * It is package private and therefore is not exposed as part of any API.
+++ *
+++ * @xerces.internal
+++ */
+++public final class SecuritySupport {
+++
+++ private static final SecuritySupport securitySupport = new SecuritySupport();
+++
+++ /**
+++ * Return an instance of this class.
+++ */
+++ public static SecuritySupport getInstance() {
+++ return securitySupport;
+++ }
+++
+++ static ClassLoader getContextClassLoader() {
+++ return (ClassLoader)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ try {
+++ cl = Thread.currentThread().getContextClassLoader();
+++ } catch (SecurityException ex) { }
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ static ClassLoader getSystemClassLoader() {
+++ return (ClassLoader)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ try {
+++ cl = ClassLoader.getSystemClassLoader();
+++ } catch (SecurityException ex) {}
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ static ClassLoader getParentClassLoader(final ClassLoader cl) {
+++ return (ClassLoader)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader parent = null;
+++ try {
+++ parent = cl.getParent();
+++ } catch (SecurityException ex) {}
+++
+++ // eliminate loops in case of the boot
+++ // ClassLoader returning itself as a parent
+++ return (parent == cl) ? null : parent;
+++ }
+++ });
+++ }
+++
+++ public static String getSystemProperty(final String propName) {
+++ return (String)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return System.getProperty(propName);
+++ }
+++ });
+++ }
+++
+++ static FileInputStream getFileInputStream(final File file)
+++ throws FileNotFoundException
+++ {
+++ try {
+++ return (FileInputStream)
+++ AccessController.doPrivileged(new PrivilegedExceptionAction() {
+++ public Object run() throws FileNotFoundException {
+++ return new FileInputStream(file);
+++ }
+++ });
+++ } catch (PrivilegedActionException e) {
+++ throw (FileNotFoundException)e.getException();
+++ }
+++ }
+++ /**
+++ * Return resource using the same classloader for the ObjectFactory by default
+++ * or bootclassloader when Security Manager is in place
+++ */
+++ public static InputStream getResourceAsStream(final String name) {
+++ if (System.getSecurityManager()!=null) {
+++ return getResourceAsStream(null, name);
+++ } else {
+++ return getResourceAsStream(ObjectFactory.findClassLoader(), name);
+++ }
+++ }
+++
+++ public static InputStream getResourceAsStream(final ClassLoader cl,
+++ final String name)
+++ {
+++ return (InputStream)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ InputStream ris;
+++ if (cl == null) {
+++ ris = Object.class.getResourceAsStream("/"+name);
+++ } else {
+++ ris = cl.getResourceAsStream(name);
+++ }
+++ return ris;
+++ }
+++ });
+++ }
+++
+++ /**
+++ * Gets a resource bundle using the specified base name, the default locale, and the caller's class loader.
+++ * @param bundle the base name of the resource bundle, a fully qualified class name
+++ * @return a resource bundle for the given base name and the default locale
+++ */
+++ public static ResourceBundle getResourceBundle(String bundle) {
+++ return getResourceBundle(bundle, Locale.getDefault());
+++ }
+++
+++ /**
+++ * Gets a resource bundle using the specified base name and locale, and the caller's class loader.
+++ * @param bundle the base name of the resource bundle, a fully qualified class name
+++ * @param locale the locale for which a resource bundle is desired
+++ * @return a resource bundle for the given base name and locale
+++ */
+++ public static ResourceBundle getResourceBundle(final String bundle, final Locale locale) {
+++ return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
+++ public ResourceBundle run() {
+++ try {
+++ return PropertyResourceBundle.getBundle(bundle, locale);
+++ } catch (MissingResourceException e) {
+++ try {
+++ return PropertyResourceBundle.getBundle(bundle, new Locale("en", "US"));
+++ } catch (MissingResourceException e2) {
+++ throw new MissingResourceException(
+++ "Could not load any resource bundle by " + bundle, bundle, "");
+++ }
+++ }
+++ }
+++ });
+++ }
+++
+++ static boolean getFileExists(final File f) {
+++ return ((Boolean)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return f.exists() ? Boolean.TRUE : Boolean.FALSE;
+++ }
+++ })).booleanValue();
+++ }
+++
+++ static long getLastModified(final File f) {
+++ return ((Long)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return new Long(f.lastModified());
+++ }
+++ })).longValue();
+++ }
+++
+++ private SecuritySupport () {}
+++}
++--- src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java 2013-04-16 14:28:09.628154939 +0100
+++++ src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -20,11 +20,11 @@
++
++ package com.sun.org.apache.xerces.internal.xinclude;
++
+++import com.sun.org.apache.xerces.internal.util.MessageFormatter;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++ import java.util.ResourceBundle;
++-import java.util.PropertyResourceBundle;
++-import com.sun.org.apache.xerces.internal.util.MessageFormatter;
++
++ // TODO: fix error messages in XIncludeMessages.properties
++ /**
++@@ -32,6 +32,7 @@
++ *
++ * @author Peter McCracken, IBM
++ *
+++ * @version $Id: XIncludeMessageFormatter.java,v 1.7 2010-11-01 04:40:18 joehw Exp $
++ */
++ public class XIncludeMessageFormatter implements MessageFormatter {
++
++@@ -61,12 +62,12 @@
++
++ if (fResourceBundle == null || locale != fLocale) {
++ if (locale != null) {
++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages", locale);
+++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages", locale);
++ // memorize the most-recent locale
++ fLocale = locale;
++ }
++ if (fResourceBundle == null)
++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages");
+++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages");
++ }
++
++ String msg = fResourceBundle.getString(key);
++--- src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java 2013-04-16 14:28:09.636155069 +0100
+++++ src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100
++@@ -24,6 +24,7 @@
++ import java.util.ResourceBundle;
++ import java.util.PropertyResourceBundle;
++ import com.sun.org.apache.xerces.internal.util.MessageFormatter;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++
++ /**
++ * XPointerMessageFormatter provides error messages for the XPointer Framework
++@@ -31,6 +32,7 @@
++ *
++ * @xerces.internal
++ *
+++ * @version $Id: XPointerMessageFormatter.java,v 1.5 2010-11-01 04:40:26 joehw Exp $
++ */
++ class XPointerMessageFormatter implements MessageFormatter {
++
++@@ -64,14 +66,14 @@
++
++ if (fResourceBundle == null || locale != fLocale) {
++ if (locale != null) {
++- fResourceBundle = PropertyResourceBundle.getBundle(
+++ fResourceBundle = SecuritySupport.getResourceBundle(
++ "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages", locale);
++ // memorize the most-recent locale
++ fLocale = locale;
++ }
++ if (fResourceBundle == null)
++- fResourceBundle = PropertyResourceBundle
++- .getBundle("com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages");
+++ fResourceBundle = SecuritySupport.getResourceBundle(
+++ "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages");
++ }
++
++ String msg = fResourceBundle.getString(key);
++--- src/com/sun/org/apache/xml/internal/dtm/DTMManager.java 2013-04-16 14:28:09.644155197 +0100
+++++ src/com/sun/org/apache/xml/internal/dtm/DTMManager.java 2013-04-16 14:29:26.557394511 +0100
++@@ -26,6 +26,7 @@
++ import com.sun.org.apache.xml.internal.res.XMLMessages;
++ import com.sun.org.apache.xml.internal.utils.PrefixResolver;
++ import com.sun.org.apache.xml.internal.utils.XMLStringFactory;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ /**
++ * A DTMManager instance can be used to create DTM and
++@@ -358,7 +359,7 @@
++ {
++ try
++ {
++- debug = System.getProperty("dtm.debug") != null;
+++ debug = SecuritySupport.getSystemProperty("dtm.debug") != null;
++ }
++ catch (SecurityException ex){}
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ca.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ca.java 2013-04-16 14:29:26.557394511 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("ca", "ES"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_cs.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_cs.java 2013-04-16 14:29:26.557394511 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("cs", "CZ"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_de.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_de.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_es.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_es.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("es", "ES"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_fr.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_fr.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_it.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_it.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("it", "IT"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ja.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ja.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources.java 2013-04-16 14:28:09.660155456 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources.java 2013-04-16 14:29:26.557394511 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -461,67 +458,4 @@
++ return msgCopy;
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ko.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ko.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("ko", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_sk.java 2013-04-16 14:28:09.664155519 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_sk.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_tr.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_tr.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("tr", "TR"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_CN.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_CN.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("zh", "CN"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "\u65e0\u6cd5\u88c5\u5165\u4efb\u4f55\u8d44\u6e90\u5305\u3002", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_TW.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_TW.java 2013-04-16 14:29:26.561394576 +0100
++@@ -24,9 +24,6 @@
++
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -442,67 +439,4 @@
++ };
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XMLErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XMLErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XMLErrorResources) ResourceBundle.getBundle(className,
++- new Locale("zh", "TW"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xml/internal/res/XMLMessages.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/res/XMLMessages.java 2013-04-16 14:29:26.561394576 +0100
++@@ -22,10 +22,9 @@
++ */
++ package com.sun.org.apache.xml.internal.res;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.util.ListResourceBundle;
++ import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * A utility class for issuing XML error messages.
++@@ -82,8 +81,9 @@
++ */
++ public static final String createXMLMessage(String msgKey, Object args[])
++ {
++- if (XMLBundle == null)
++- XMLBundle = loadResourceBundle(XML_ERROR_RESOURCES);
+++ if (XMLBundle == null) {
+++ XMLBundle = SecuritySupport.getResourceBundle(XML_ERROR_RESOURCES);
+++ }
++
++ if (XMLBundle != null)
++ {
++@@ -156,61 +156,4 @@
++ return fmsg;
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className The class name of the resource bundle.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static ListResourceBundle loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++- Locale locale = Locale.getDefault();
++-
++- try
++- {
++- return (ListResourceBundle)ResourceBundle.getBundle(className, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (ListResourceBundle)ResourceBundle.getBundle(
++- className, new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles." + className, className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which can be appended to a resource name
++- */
++- protected static String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++ }
++--- src/com/sun/org/apache/xml/internal/resolver/Catalog.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/resolver/Catalog.java 2013-04-16 14:29:26.561394576 +0100
++@@ -23,6 +23,8 @@
++
++ package com.sun.org.apache.xml.internal.resolver;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
+++
++ import java.io.IOException;
++ import java.io.FileNotFoundException;
++ import java.io.InputStream;
++@@ -819,7 +821,7 @@
++ // tack on a basename because URLs point to files not dirs
++ catalogCwd = FileURL.makeURL("basename");
++ } catch (MalformedURLException e) {
++- String userdir = System.getProperty("user.dir");
+++ String userdir = SecuritySupport.getSystemProperty("user.dir");
++ userdir.replace('\\', '/');
++ catalogManager.debug.message(1, "Malformed URL on cwd", userdir);
++ catalogCwd = null;
++@@ -1715,7 +1717,7 @@
++ protected String resolveLocalSystem(String systemId)
++ throws MalformedURLException, IOException {
++
++- String osname = System.getProperty("os.name");
+++ String osname = SecuritySupport.getSystemProperty("os.name");
++ boolean windows = (osname.indexOf("Windows") >= 0);
++ Enumeration en = catalogEntries.elements();
++ while (en.hasMoreElements()) {
++--- src/com/sun/org/apache/xml/internal/resolver/CatalogManager.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/resolver/CatalogManager.java 2013-04-16 14:29:26.561394576 +0100
++@@ -23,6 +23,7 @@
++
++ package com.sun.org.apache.xml.internal.resolver;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import java.io.InputStream;
++
++ import java.net.URL;
++@@ -141,8 +142,8 @@
++
++ /** Flag to ignore missing property files and/or properties */
++ private boolean ignoreMissingProperties
++- = (System.getProperty(pIgnoreMissing) != null
++- || System.getProperty(pFiles) != null);
+++ = (SecuritySupport.getSystemProperty(pIgnoreMissing) != null
+++ || SecuritySupport.getSystemProperty(pFiles) != null);
++
++ /** Holds the resources after they are loaded from the file. */
++ private ResourceBundle resources;
++@@ -331,7 +332,7 @@
++ private int queryVerbosity () {
++ String defaultVerbStr = Integer.toString(defaultVerbosity);
++
++- String verbStr = System.getProperty(pVerbosity);
+++ String verbStr = SecuritySupport.getSystemProperty(pVerbosity);
++
++ if (verbStr == null) {
++ if (resources==null) readProperties();
++@@ -466,7 +467,7 @@
++ * @return A semicolon delimited list of catlog file URIs
++ */
++ private String queryCatalogFiles () {
++- String catalogList = System.getProperty(pFiles);
+++ String catalogList = SecuritySupport.getSystemProperty(pFiles);
++ fromPropertiesFile = false;
++
++ if (catalogList == null) {
++@@ -551,7 +552,7 @@
++ * defaultPreferSetting.
++ */
++ private boolean queryPreferPublic () {
++- String prefer = System.getProperty(pPrefer);
+++ String prefer = SecuritySupport.getSystemProperty(pPrefer);
++
++ if (prefer == null) {
++ if (resources==null) readProperties();
++@@ -610,7 +611,7 @@
++ * defaultUseStaticCatalog.
++ */
++ private boolean queryUseStaticCatalog () {
++- String staticCatalog = System.getProperty(pStatic);
+++ String staticCatalog = SecuritySupport.getSystemProperty(pStatic);
++
++ if (staticCatalog == null) {
++ if (resources==null) readProperties();
++@@ -741,7 +742,7 @@
++ * defaultOasisXMLCatalogPI.
++ */
++ public boolean queryAllowOasisXMLCatalogPI () {
++- String allow = System.getProperty(pAllowPI);
+++ String allow = SecuritySupport.getSystemProperty(pAllowPI);
++
++ if (allow == null) {
++ if (resources==null) readProperties();
++@@ -794,7 +795,7 @@
++ *
++ */
++ public String queryCatalogClassName () {
++- String className = System.getProperty(pClassname);
+++ String className = SecuritySupport.getSystemProperty(pClassname);
++
++ if (className == null) {
++ if (resources==null) readProperties();
++--- src/com/sun/org/apache/xml/internal/resolver/Resolver.java 2013-04-16 14:28:09.668155584 +0100
+++++ src/com/sun/org/apache/xml/internal/resolver/Resolver.java 2013-04-16 14:29:26.561394576 +0100
++@@ -31,6 +31,7 @@
++ import java.net.URL;
++ import java.net.URLConnection;
++ import java.net.MalformedURLException;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import com.sun.org.apache.xml.internal.resolver.readers.SAXCatalogReader;
++ import com.sun.org.apache.xml.internal.resolver.readers.OASISXMLCatalogReader;
++ import com.sun.org.apache.xml.internal.resolver.readers.TR9401CatalogReader;
++@@ -521,7 +522,7 @@
++ */
++ private Vector resolveAllLocalSystem(String systemId) {
++ Vector map = new Vector();
++- String osname = System.getProperty("os.name");
+++ String osname = SecuritySupport.getSystemProperty("os.name");
++ boolean windows = (osname.indexOf("Windows") >= 0);
++ Enumeration en = catalogEntries.elements();
++ while (en.hasMoreElements()) {
++@@ -549,7 +550,7 @@
++ */
++ private Vector resolveLocalSystemReverse(String systemId) {
++ Vector map = new Vector();
++- String osname = System.getProperty("os.name");
+++ String osname = SecuritySupport.getSystemProperty("os.name");
++ boolean windows = (osname.indexOf("Windows") >= 0);
++ Enumeration en = catalogEntries.elements();
++ while (en.hasMoreElements()) {
++--- src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java 2013-04-16 14:28:09.684155841 +0100
+++++ src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java 2013-04-16 14:29:26.561394576 +0100
++@@ -21,6 +21,7 @@
++
++ package com.sun.org.apache.xml.internal.serialize;
++
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++
++ import java.io.OutputStream;
++ import java.io.Writer;
++@@ -63,7 +64,7 @@
++ factory = new SerializerFactoryImpl( Method.TEXT );
++ registerSerializerFactory( factory );
++
++- list = System.getProperty( FactoriesProperty );
+++ list = SecuritySupport.getSystemProperty( FactoriesProperty );
++ if ( list != null ) {
++ token = new StringTokenizer( list, " ;,:" );
++ while ( token.hasMoreTokens() ) {
++--- src/com/sun/org/apache/xml/internal/serializer/Encodings.java 2013-04-16 14:28:09.684155841 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/Encodings.java 2013-04-16 14:29:26.561394576 +0100
++@@ -34,6 +34,7 @@
++ import java.util.Properties;
++ import java.util.StringTokenizer;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ /**
++ * Provides information about encodings. Depends on the Java runtime
++@@ -218,7 +219,7 @@
++ // Get the default system character encoding. This may be
++ // incorrect if they passed in a writer, but right now there
++ // seems to be no way to get the encoding from a writer.
++- encoding = System.getProperty("file.encoding", "UTF8");
+++ encoding = SecuritySupport.getSystemProperty("file.encoding", "UTF8");
++
++ if (null != encoding)
++ {
++@@ -312,7 +313,7 @@
++
++ try
++ {
++- urlString = System.getProperty(ENCODINGS_PROP, "");
+++ urlString = SecuritySupport.getSystemProperty(ENCODINGS_PROP, "");
++ }
++ catch (SecurityException e)
++ {
++@@ -324,9 +325,7 @@
++ }
++
++ if (is == null) {
++- SecuritySupport ss = SecuritySupport.getInstance();
++- is = ss.getResourceAsStream(ObjectFactory.findClassLoader(),
++- ENCODINGS_FILE);
+++ is = SecuritySupport.getResourceAsStream(ENCODINGS_FILE);
++ }
++
++ Properties props = new Properties();
++--- src/com/sun/org/apache/xml/internal/serializer/ObjectFactory.java 2013-04-16 14:28:09.688155906 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100
++@@ -1,662 +0,0 @@
++-/*
++- * reserved comment block
++- * DO NOT REMOVE OR ALTER!
++- */
++-/*
++- * Copyright 2001-2004 The Apache Software Foundation.
++- *
++- * Licensed under the Apache License, Version 2.0 (the "License");
++- * you may not use this file except in compliance with the License.
++- * You may obtain a copy of the License at
++- *
++- * http://www.apache.org/licenses/LICENSE-2.0
++- *
++- * Unless required by applicable law or agreed to in writing, software
++- * distributed under the License is distributed on an "AS IS" BASIS,
++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++- * See the License for the specific language governing permissions and
++- * limitations under the License.
++- */
++-/*
++- * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 08:15:20 suresh_emailid Exp $
++- */
++-
++-package com.sun.org.apache.xml.internal.serializer;
++-
++-import java.io.BufferedReader;
++-import java.io.File;
++-import java.io.FileInputStream;
++-import java.io.IOException;
++-import java.io.InputStream;
++-import java.io.InputStreamReader;
++-import java.util.Properties;
++-
++-/**
++- * This class is duplicated for each JAXP subpackage so keep it in sync.
++- * It is package private and therefore is not exposed as part of the JAXP
++- * API.
++- * <p>
++- * This code is designed to implement the JAXP 1.1 spec pluggability
++- * feature and is designed to run on JDK version 1.1 and
++- * later, and to compile on JDK 1.2 and onward.
++- * The code also runs both as part of an unbundled jar file and
++- * when bundled as part of the JDK.
++- * <p>
++- * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code>
++- * class and modified to be used as a general utility for creating objects
++- * dynamically.
++- *
++- * @xsl.usage internal
++- */
++-class ObjectFactory {
++-
++- //
++- // Constants
++- //
++-
++- // name of default properties file to look for in JDK's jre/lib directory
++- private static final String DEFAULT_PROPERTIES_FILENAME =
++- "xalan.properties";
++-
++- private static final String SERVICES_PATH = "META-INF/services/";
++-
++- /** Set to true for debugging */
++- private static final boolean DEBUG = false;
++-
++- /** cache the contents of the xalan.properties file.
++- * Until an attempt has been made to read this file, this will
++- * be null; if the file does not exist or we encounter some other error
++- * during the read, this will be empty.
++- */
++- private static Properties fXalanProperties = null;
++-
++- /***
++- * Cache the time stamp of the xalan.properties file so
++- * that we know if it's been modified and can invalidate
++- * the cache when necessary.
++- */
++- private static long fLastModified = -1;
++-
++- //
++- // Public static methods
++- //
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return instance of factory, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Object createObject(String factoryId, String fallbackClassName)
++- throws ConfigurationError {
++- return createObject(factoryId, null, fallbackClassName);
++- } // createObject(String,String):Object
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return instance of factory, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Object createObject(String factoryId,
++- String propertiesFilename,
++- String fallbackClassName)
++- throws ConfigurationError
++- {
++- Class factoryClass = lookUpFactoryClass(factoryId,
++- propertiesFilename,
++- fallbackClassName);
++-
++- if (factoryClass == null) {
++- throw new ConfigurationError(
++- "Provider for " + factoryId + " cannot be found", null);
++- }
++-
++- try{
++- Object instance = factoryClass.newInstance();
++- if (DEBUG) debugPrintln("created new instance of factory " + factoryId);
++- return instance;
++- } catch (Exception x) {
++- throw new ConfigurationError(
++- "Provider for factory " + factoryId
++- + " could not be instantiated: " + x, x);
++- }
++- } // createObject(String,String,String):Object
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return Class object of factory, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Class lookUpFactoryClass(String factoryId)
++- throws ConfigurationError
++- {
++- return lookUpFactoryClass(factoryId, null, null);
++- } // lookUpFactoryClass(String):Class
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return Class object that provides factory service, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Class lookUpFactoryClass(String factoryId,
++- String propertiesFilename,
++- String fallbackClassName)
++- throws ConfigurationError
++- {
++- String factoryClassName = lookUpFactoryClassName(factoryId,
++- propertiesFilename,
++- fallbackClassName);
++- ClassLoader cl = findClassLoader();
++-
++- if (factoryClassName == null) {
++- factoryClassName = fallbackClassName;
++- }
++-
++- // assert(className != null);
++- try{
++- Class providerClass = findProviderClass(factoryClassName,
++- cl,
++- true);
++- if (DEBUG) debugPrintln("created new instance of " + providerClass +
++- " using ClassLoader: " + cl);
++- return providerClass;
++- } catch (ClassNotFoundException x) {
++- throw new ConfigurationError(
++- "Provider " + factoryClassName + " not found", x);
++- } catch (Exception x) {
++- throw new ConfigurationError(
++- "Provider "+factoryClassName+" could not be instantiated: "+x,
++- x);
++- }
++- } // lookUpFactoryClass(String,String,String):Class
++-
++- /**
++- * Finds the name of the required implementation class in the specified
++- * order. The specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return name of class that provides factory service, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static String lookUpFactoryClassName(String factoryId,
++- String propertiesFilename,
++- String fallbackClassName)
++- {
++- SecuritySupport ss = SecuritySupport.getInstance();
++-
++- // Use the system property first
++- try {
++- String systemProp = ss.getSystemProperty(factoryId);
++- if (systemProp != null) {
++- if (DEBUG) debugPrintln("found system property, value=" + systemProp);
++- return systemProp;
++- }
++- } catch (SecurityException se) {
++- // Ignore and continue w/ next location
++- }
++-
++- // Try to read from propertiesFilename, or
++- // $java.home/lib/xalan.properties
++- String factoryClassName = null;
++- // no properties file name specified; use
++- // $JAVA_HOME/lib/xalan.properties:
++- if (propertiesFilename == null) {
++- File propertiesFile = null;
++- boolean propertiesFileExists = false;
++- try {
++- String javah = ss.getSystemProperty("java.home");
++- propertiesFilename = javah + File.separator +
++- "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;
++- propertiesFile = new File(propertiesFilename);
++- propertiesFileExists = ss.getFileExists(propertiesFile);
++- } catch (SecurityException e) {
++- // try again...
++- fLastModified = -1;
++- fXalanProperties = null;
++- }
++-
++- synchronized (ObjectFactory.class) {
++- boolean loadProperties = false;
++- FileInputStream fis = null;
++- try {
++- // file existed last time
++- if(fLastModified >= 0) {
++- if(propertiesFileExists &&
++- (fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) {
++- loadProperties = true;
++- } else {
++- // file has stopped existing...
++- if(!propertiesFileExists) {
++- fLastModified = -1;
++- fXalanProperties = null;
++- } // else, file wasn't modified!
++- }
++- } else {
++- // file has started to exist:
++- if(propertiesFileExists) {
++- loadProperties = true;
++- fLastModified = ss.getLastModified(propertiesFile);
++- } // else, nothing's changed
++- }
++- if(loadProperties) {
++- // must never have attempted to read xalan.properties
++- // before (or it's outdeated)
++- fXalanProperties = new Properties();
++- fis = ss.getFileInputStream(propertiesFile);
++- fXalanProperties.load(fis);
++- }
++- } catch (Exception x) {
++- fXalanProperties = null;
++- fLastModified = -1;
++- // assert(x instanceof FileNotFoundException
++- // || x instanceof SecurityException)
++- // In both cases, ignore and continue w/ next location
++- }
++- finally {
++- // try to close the input stream if one was opened.
++- if (fis != null) {
++- try {
++- fis.close();
++- }
++- // Ignore the exception.
++- catch (IOException exc) {}
++- }
++- }
++- }
++- if(fXalanProperties != null) {
++- factoryClassName = fXalanProperties.getProperty(factoryId);
++- }
++- } else {
++- FileInputStream fis = null;
++- try {
++- fis = ss.getFileInputStream(new File(propertiesFilename));
++- Properties props = new Properties();
++- props.load(fis);
++- factoryClassName = props.getProperty(factoryId);
++- } catch (Exception x) {
++- // assert(x instanceof FileNotFoundException
++- // || x instanceof SecurityException)
++- // In both cases, ignore and continue w/ next location
++- }
++- finally {
++- // try to close the input stream if one was opened.
++- if (fis != null) {
++- try {
++- fis.close();
++- }
++- // Ignore the exception.
++- catch (IOException exc) {}
++- }
++- }
++- }
++- if (factoryClassName != null) {
++- if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value="
++- + factoryClassName);
++- return factoryClassName;
++- }
++-
++- // Try Jar Service Provider Mechanism
++- return findJarServiceProviderName(factoryId);
++- } // lookUpFactoryClass(String,String):String
++-
++- //
++- // Private static methods
++- //
++-
++- /** Prints a message to standard error if debugging is enabled. */
++- private static void debugPrintln(String msg) {
++- if (DEBUG) {
++- System.err.println("JAXP: " + msg);
++- }
++- } // debugPrintln(String)
++-
++- /**
++- * Figure out which ClassLoader to use. For JDK 1.2 and later use
++- * the context ClassLoader.
++- */
++- static ClassLoader findClassLoader()
++- throws ConfigurationError
++- {
++- SecuritySupport ss = SecuritySupport.getInstance();
++-
++- // Figure out which ClassLoader to use for loading the provider
++- // class. If there is a Context ClassLoader then use it.
++- ClassLoader context = ss.getContextClassLoader();
++- ClassLoader system = ss.getSystemClassLoader();
++-
++- ClassLoader chain = system;
++- while (true) {
++- if (context == chain) {
++- // Assert: we are on JDK 1.1 or we have no Context ClassLoader
++- // or any Context ClassLoader in chain of system classloader
++- // (including extension ClassLoader) so extend to widest
++- // ClassLoader (always look in system ClassLoader if Xalan
++- // is in boot/extension/system classpath and in current
++- // ClassLoader otherwise); normal classloaders delegate
++- // back to system ClassLoader first so this widening doesn't
++- // change the fact that context ClassLoader will be consulted
++- ClassLoader current = ObjectFactory.class.getClassLoader();
++-
++- chain = system;
++- while (true) {
++- if (current == chain) {
++- // Assert: Current ClassLoader in chain of
++- // boot/extension/system ClassLoaders
++- return system;
++- }
++- if (chain == null) {
++- break;
++- }
++- chain = ss.getParentClassLoader(chain);
++- }
++-
++- // Assert: Current ClassLoader not in chain of
++- // boot/extension/system ClassLoaders
++- return current;
++- }
++-
++- if (chain == null) {
++- // boot ClassLoader reached
++- break;
++- }
++-
++- // Check for any extension ClassLoaders in chain up to
++- // boot ClassLoader
++- chain = ss.getParentClassLoader(chain);
++- };
++-
++- // Assert: Context ClassLoader not in chain of
++- // boot/extension/system ClassLoaders
++- return context;
++- } // findClassLoader():ClassLoader
++-
++- /**
++- * Create an instance of a class using the specified ClassLoader
++- */
++- static Object newInstance(String className, ClassLoader cl,
++- boolean doFallback)
++- throws ConfigurationError
++- {
++- // assert(className != null);
++- try{
++- Class providerClass = findProviderClass(className, cl, doFallback);
++- Object instance = providerClass.newInstance();
++- if (DEBUG) debugPrintln("created new instance of " + providerClass +
++- " using ClassLoader: " + cl);
++- return instance;
++- } catch (ClassNotFoundException x) {
++- throw new ConfigurationError(
++- "Provider " + className + " not found", x);
++- } catch (Exception x) {
++- throw new ConfigurationError(
++- "Provider " + className + " could not be instantiated: " + x,
++- x);
++- }
++- }
++-
++- /**
++- * Find a Class using the specified ClassLoader
++- */
++- static Class findProviderClass(String className, ClassLoader cl,
++- boolean doFallback)
++- throws ClassNotFoundException, ConfigurationError
++- {
++- //throw security exception if the calling thread is not allowed to access the
++- //class. Restrict the access to the package classes as specified in java.security policy.
++- SecurityManager security = System.getSecurityManager();
++- try{
++- if (security != null){
++- final int lastDot = className.lastIndexOf(".");
++- String packageName = className;
++- if (lastDot != -1) packageName = className.substring(0, lastDot);
++- security.checkPackageAccess(packageName);
++- }
++- }catch(SecurityException e){
++- throw e;
++- }
++-
++- Class providerClass;
++- if (cl == null) {
++- // XXX Use the bootstrap ClassLoader. There is no way to
++- // load a class using the bootstrap ClassLoader that works
++- // in both JDK 1.1 and Java 2. However, this should still
++- // work b/c the following should be true:
++- //
++- // (cl == null) iff current ClassLoader == null
++- //
++- // Thus Class.forName(String) will use the current
++- // ClassLoader which will be the bootstrap ClassLoader.
++- providerClass = Class.forName(className);
++- } else {
++- try {
++- providerClass = cl.loadClass(className);
++- } catch (ClassNotFoundException x) {
++- if (doFallback) {
++- // Fall back to current classloader
++- ClassLoader current = ObjectFactory.class.getClassLoader();
++- if (current == null) {
++- providerClass = Class.forName(className);
++- } else if (cl != current) {
++- cl = current;
++- providerClass = cl.loadClass(className);
++- } else {
++- throw x;
++- }
++- } else {
++- throw x;
++- }
++- }
++- }
++-
++- return providerClass;
++- }
++-
++- /**
++- * Find the name of service provider using Jar Service Provider Mechanism
++- *
++- * @return instance of provider class if found or null
++- */
++- private static String findJarServiceProviderName(String factoryId)
++- {
++- SecuritySupport ss = SecuritySupport.getInstance();
++- String serviceId = SERVICES_PATH + factoryId;
++- InputStream is = null;
++-
++- // First try the Context ClassLoader
++- ClassLoader cl = findClassLoader();
++-
++- is = ss.getResourceAsStream(cl, serviceId);
++-
++- // If no provider found then try the current ClassLoader
++- if (is == null) {
++- ClassLoader current = ObjectFactory.class.getClassLoader();
++- if (cl != current) {
++- cl = current;
++- is = ss.getResourceAsStream(cl, serviceId);
++- }
++- }
++-
++- if (is == null) {
++- // No provider found
++- return null;
++- }
++-
++- if (DEBUG) debugPrintln("found jar resource=" + serviceId +
++- " using ClassLoader: " + cl);
++-
++- // Read the service provider name in UTF-8 as specified in
++- // the jar spec. Unfortunately this fails in Microsoft
++- // VJ++, which does not implement the UTF-8
++- // encoding. Theoretically, we should simply let it fail in
++- // that case, since the JVM is obviously broken if it
++- // doesn't support such a basic standard. But since there
++- // are still some users attempting to use VJ++ for
++- // development, we have dropped in a fallback which makes a
++- // second attempt using the platform's default encoding. In
++- // VJ++ this is apparently ASCII, which is a subset of
++- // UTF-8... and since the strings we'll be reading here are
++- // also primarily limited to the 7-bit ASCII range (at
++- // least, in English versions), this should work well
++- // enough to keep us on the air until we're ready to
++- // officially decommit from VJ++. [Edited comment from
++- // jkesselm]
++- BufferedReader rd;
++- try {
++- rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
++- } catch (java.io.UnsupportedEncodingException e) {
++- rd = new BufferedReader(new InputStreamReader(is));
++- }
++-
++- String factoryClassName = null;
++- try {
++- // XXX Does not handle all possible input as specified by the
++- // Jar Service Provider specification
++- factoryClassName = rd.readLine();
++- } catch (IOException x) {
++- // No provider found
++- return null;
++- }
++- finally {
++- try {
++- // try to close the reader.
++- rd.close();
++- }
++- // Ignore the exception.
++- catch (IOException exc) {}
++- }
++-
++- if (factoryClassName != null &&
++- ! "".equals(factoryClassName)) {
++- if (DEBUG) debugPrintln("found in resource, value="
++- + factoryClassName);
++-
++- // Note: here we do not want to fall back to the current
++- // ClassLoader because we want to avoid the case where the
++- // resource file was found using one ClassLoader and the
++- // provider class was instantiated using a different one.
++- return factoryClassName;
++- }
++-
++- // No provider found
++- return null;
++- }
++-
++- //
++- // Classes
++- //
++-
++- /**
++- * A configuration error.
++- */
++- static class ConfigurationError
++- extends Error {
++- static final long serialVersionUID = 8859254254255146542L;
++- //
++- // Data
++- //
++-
++- /** Exception. */
++- private Exception exception;
++-
++- //
++- // Constructors
++- //
++-
++- /**
++- * Construct a new instance with the specified detail string and
++- * exception.
++- */
++- ConfigurationError(String msg, Exception x) {
++- super(msg);
++- this.exception = x;
++- } // <init>(String,Exception)
++-
++- //
++- // Public methods
++- //
++-
++- /** Returns the exception associated to this error. */
++- Exception getException() {
++- return exception;
++- } // getException():Exception
++-
++- } // class ConfigurationError
++-
++-} // class ObjectFactory
++--- src/com/sun/org/apache/xml/internal/serializer/OutputPropertiesFactory.java 2013-04-16 14:28:09.688155906 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/OutputPropertiesFactory.java 2013-04-16 14:29:26.561394576 +0100
++@@ -22,6 +22,7 @@
++ */
++ package com.sun.org.apache.xml.internal.serializer;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.io.BufferedInputStream;
++ import java.io.IOException;
++ import java.io.InputStream;
++@@ -451,7 +452,7 @@
++ String value = null;
++ try
++ {
++- value = System.getProperty(key);
+++ value = SecuritySupport.getSystemProperty(key);
++ }
++ catch (SecurityException se)
++ {
++@@ -464,7 +465,7 @@
++ String newValue = null;
++ try
++ {
++- newValue = System.getProperty(newKey);
+++ newValue = SecuritySupport.getSystemProperty(newKey);
++ }
++ catch (SecurityException se)
++ {
++--- src/com/sun/org/apache/xml/internal/serializer/SecuritySupport12.java 2013-04-16 14:28:09.688155906 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/SecuritySupport12.java 1970-01-01 01:00:00.000000000 +0100
++@@ -1,145 +0,0 @@
++-/*
++- * reserved comment block
++- * DO NOT REMOVE OR ALTER!
++- */
++-/*
++- * Copyright 2002-2004 The Apache Software Foundation.
++- *
++- * Licensed under the Apache License, Version 2.0 (the "License");
++- * you may not use this file except in compliance with the License.
++- * You may obtain a copy of the License at
++- *
++- * http://www.apache.org/licenses/LICENSE-2.0
++- *
++- * Unless required by applicable law or agreed to in writing, software
++- * distributed under the License is distributed on an "AS IS" BASIS,
++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++- * See the License for the specific language governing permissions and
++- * limitations under the License.
++- */
++-/*
++- * $Id: SecuritySupport12.java,v 1.2.4.1 2005/09/15 08:15:22 suresh_emailid Exp $
++- */
++-
++-package com.sun.org.apache.xml.internal.serializer;
++-
++-import java.io.File;
++-import java.io.FileInputStream;
++-import java.io.FileNotFoundException;
++-import java.io.InputStream;
++-import java.security.AccessController;
++-import java.security.PrivilegedAction;
++-import java.security.PrivilegedActionException;
++-import java.security.PrivilegedExceptionAction;
++-
++-/**
++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync.
++- * It is package private and therefore is not exposed as part of the Xalan-Java
++- * API.
++- *
++- * Security related methods that only work on J2SE 1.2 and newer.
++- */
++-class SecuritySupport12 extends SecuritySupport {
++-
++- ClassLoader getContextClassLoader() {
++- return (ClassLoader)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- ClassLoader cl = null;
++- try {
++- cl = Thread.currentThread().getContextClassLoader();
++- } catch (SecurityException ex) { }
++- return cl;
++- }
++- });
++- }
++-
++- ClassLoader getSystemClassLoader() {
++- return (ClassLoader)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- ClassLoader cl = null;
++- try {
++- cl = ClassLoader.getSystemClassLoader();
++- } catch (SecurityException ex) {}
++- return cl;
++- }
++- });
++- }
++-
++- ClassLoader getParentClassLoader(final ClassLoader cl) {
++- return (ClassLoader)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- ClassLoader parent = null;
++- try {
++- parent = cl.getParent();
++- } catch (SecurityException ex) {}
++-
++- // eliminate loops in case of the boot
++- // ClassLoader returning itself as a parent
++- return (parent == cl) ? null : parent;
++- }
++- });
++- }
++-
++- String getSystemProperty(final String propName) {
++- return (String)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- return System.getProperty(propName);
++- }
++- });
++- }
++-
++- FileInputStream getFileInputStream(final File file)
++- throws FileNotFoundException
++- {
++- try {
++- return (FileInputStream)
++- AccessController.doPrivileged(new PrivilegedExceptionAction() {
++- public Object run() throws FileNotFoundException {
++- return new FileInputStream(file);
++- }
++- });
++- } catch (PrivilegedActionException e) {
++- throw (FileNotFoundException)e.getException();
++- }
++- }
++-
++- InputStream getResourceAsStream(final ClassLoader cl,
++- final String name)
++- {
++- return (InputStream)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- InputStream ris;
++- if (cl == null) {
++- ris = ClassLoader.getSystemResourceAsStream(name);
++- } else {
++- ris = cl.getResourceAsStream(name);
++- }
++- return ris;
++- }
++- });
++- }
++-
++- boolean getFileExists(final File f) {
++- return ((Boolean)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- return new Boolean(f.exists());
++- }
++- })).booleanValue();
++- }
++-
++- long getLastModified(final File f) {
++- return ((Long)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- return new Long(f.lastModified());
++- }
++- })).longValue();
++- }
++-
++-}
++--- src/com/sun/org/apache/xml/internal/serializer/SecuritySupport.java 2013-04-16 14:28:09.688155906 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100
++@@ -1,125 +0,0 @@
++-/*
++- * reserved comment block
++- * DO NOT REMOVE OR ALTER!
++- */
++-/*
++- * Copyright 2002-2004 The Apache Software Foundation.
++- *
++- * Licensed under the Apache License, Version 2.0 (the "License");
++- * you may not use this file except in compliance with the License.
++- * You may obtain a copy of the License at
++- *
++- * http://www.apache.org/licenses/LICENSE-2.0
++- *
++- * Unless required by applicable law or agreed to in writing, software
++- * distributed under the License is distributed on an "AS IS" BASIS,
++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++- * See the License for the specific language governing permissions and
++- * limitations under the License.
++- */
++-/*
++- * $Id: SecuritySupport.java,v 1.2.4.1 2005/09/15 08:15:21 suresh_emailid Exp $
++- */
++-
++-package com.sun.org.apache.xml.internal.serializer;
++-
++-import java.io.File;
++-import java.io.FileInputStream;
++-import java.io.FileNotFoundException;
++-import java.io.InputStream;
++-
++-/**
++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync.
++- * It is package private and therefore is not exposed as part of the Xalan-Java
++- * API.
++- *
++- * Base class with security related methods that work on JDK 1.1.
++- */
++-class SecuritySupport {
++-
++- /*
++- * Make this of type Object so that the verifier won't try to
++- * prove its type, thus possibly trying to load the SecuritySupport12
++- * class.
++- */
++- private static final Object securitySupport;
++-
++- static {
++- SecuritySupport ss = null;
++- try {
++- Class c = Class.forName("java.security.AccessController");
++- // if that worked, we're on 1.2.
++- /*
++- // don't reference the class explicitly so it doesn't
++- // get dragged in accidentally.
++- c = Class.forName("javax.mail.SecuritySupport12");
++- Constructor cons = c.getConstructor(new Class[] { });
++- ss = (SecuritySupport)cons.newInstance(new Object[] { });
++- */
++- /*
++- * Unfortunately, we can't load the class using reflection
++- * because the class is package private. And the class has
++- * to be package private so the APIs aren't exposed to other
++- * code that could use them to circumvent security. Thus,
++- * we accept the risk that the direct reference might fail
++- * on some JDK 1.1 JVMs, even though we would never execute
++- * this code in such a case. Sigh...
++- */
++- ss = new SecuritySupport12();
++- } catch (Exception ex) {
++- // ignore it
++- } finally {
++- if (ss == null)
++- ss = new SecuritySupport();
++- securitySupport = ss;
++- }
++- }
++-
++- /**
++- * Return an appropriate instance of this class, depending on whether
++- * we're on a JDK 1.1 or J2SE 1.2 (or later) system.
++- */
++- static SecuritySupport getInstance() {
++- return (SecuritySupport)securitySupport;
++- }
++-
++- ClassLoader getContextClassLoader() {
++- return null;
++- }
++-
++- ClassLoader getSystemClassLoader() {
++- return null;
++- }
++-
++- ClassLoader getParentClassLoader(ClassLoader cl) {
++- return null;
++- }
++-
++- String getSystemProperty(String propName) {
++- return System.getProperty(propName);
++- }
++-
++- FileInputStream getFileInputStream(File file)
++- throws FileNotFoundException
++- {
++- return new FileInputStream(file);
++- }
++-
++- InputStream getResourceAsStream(ClassLoader cl, String name) {
++- InputStream ris;
++- if (cl == null) {
++- ris = ClassLoader.getSystemResourceAsStream(name);
++- } else {
++- ris = cl.getResourceAsStream(name);
++- }
++- return ris;
++- }
++-
++- boolean getFileExists(File f) {
++- return f.exists();
++- }
++-
++- long getLastModified(File f) {
++- return f.lastModified();
++- }
++-}
++--- src/com/sun/org/apache/xml/internal/serializer/ToStream.java 2013-04-16 14:28:09.700156100 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/ToStream.java 2013-04-16 14:29:26.565394640 +0100
++@@ -22,6 +22,7 @@
++ */
++ package com.sun.org.apache.xml.internal.serializer;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.io.IOException;
++ import java.io.OutputStream;
++ import java.io.UnsupportedEncodingException;
++@@ -140,7 +141,7 @@
++ * extension attribute xalan:line-separator.
++ */
++ protected char[] m_lineSep =
++- System.getProperty("line.separator").toCharArray();
+++ SecuritySupport.getSystemProperty("line.separator").toCharArray();
++
++ /**
++ * True if the the system line separator is to be used.
++--- src/com/sun/org/apache/xml/internal/serializer/TreeWalker.java 2013-04-16 14:28:09.704156164 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/TreeWalker.java 2013-04-16 14:29:26.565394640 +0100
++@@ -22,6 +22,7 @@
++ */
++ package com.sun.org.apache.xml.internal.serializer;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.io.File;
++
++ import com.sun.org.apache.xml.internal.serializer.utils.AttList;
++@@ -104,7 +105,7 @@
++ else {
++ try {
++ // Bug see Bugzilla 26741
++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
+++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl");
++ }
++ catch (SecurityException se) {// user.dir not accessible from applet
++ }
++@@ -115,7 +116,7 @@
++ m_contentHandler.setDocumentLocator(m_locator);
++ try {
++ // Bug see Bugzilla 26741
++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
+++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl");
++ }
++ catch (SecurityException se){// user.dir not accessible from applet
++
++--- src/com/sun/org/apache/xml/internal/serializer/utils/Messages.java 2013-04-16 14:28:09.708156229 +0100
+++++ src/com/sun/org/apache/xml/internal/serializer/utils/Messages.java 2013-04-16 14:29:26.565394640 +0100
++@@ -22,6 +22,7 @@
++ */
++ package com.sun.org.apache.xml.internal.serializer.utils;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.util.ListResourceBundle;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++@@ -87,9 +88,6 @@
++ * can have the Message strings translated in an alternate language
++ * in a errorResourceClass with a language suffix.
++ *
++- * More sophisticated use of this class would be to pass null
++- * when contructing it, but then call loadResourceBundle()
++- * before creating any messages.
++ *
++ * This class is not a public API, it is only public because it is
++ * used in com.sun.org.apache.xml.internal.serializer.
++@@ -126,18 +124,6 @@
++ m_resourceBundleName = resourceBundle;
++ }
++
++- /*
++- * Set the Locale object to use. If this method is not called the
++- * default locale is used. This method needs to be called before
++- * loadResourceBundle().
++- *
++- * @param locale non-null reference to Locale object.
++- * @xsl.usage internal
++- */
++-// public void setLocale(Locale locale)
++-// {
++-// m_locale = locale;
++-// }
++
++ /**
++ * Get the Locale object that is being used.
++@@ -151,16 +137,6 @@
++ }
++
++ /**
++- * Get the ListResourceBundle being used by this Messages instance which was
++- * previously set by a call to loadResourceBundle(className)
++- * @xsl.usage internal
++- */
++- private ListResourceBundle getResourceBundle()
++- {
++- return m_resourceBundle;
++- }
++-
++- /**
++ * Creates a message from the specified key and replacement
++ * arguments, localized to the given locale.
++ *
++@@ -174,7 +150,7 @@
++ public final String createMessage(String msgKey, Object args[])
++ {
++ if (m_resourceBundle == null)
++- m_resourceBundle = loadResourceBundle(m_resourceBundleName);
+++ m_resourceBundle = SecuritySupport.getResourceBundle(m_resourceBundleName);
++
++ if (m_resourceBundle != null)
++ {
++@@ -293,76 +269,4 @@
++ return fmsg;
++ }
++
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className the name of the class that implements ListResourceBundle,
++- * without language suffix.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- * @xsl.usage internal
++- */
++- private ListResourceBundle loadResourceBundle(String resourceBundle)
++- throws MissingResourceException
++- {
++- m_resourceBundleName = resourceBundle;
++- Locale locale = getLocale();
++-
++- ListResourceBundle lrb;
++-
++- try
++- {
++-
++- ResourceBundle rb =
++- ResourceBundle.getBundle(m_resourceBundleName, locale);
++- lrb = (ListResourceBundle) rb;
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- lrb =
++- (ListResourceBundle) ResourceBundle.getBundle(
++- m_resourceBundleName,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles." + m_resourceBundleName,
++- m_resourceBundleName,
++- "");
++- }
++- }
++- m_resourceBundle = lrb;
++- return lrb;
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which can be appended to a resource name
++- * @xsl.usage internal
++- */
++- private static String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++ }
++--- src/com/sun/org/apache/xml/internal/utils/res/XResourceBundle.java 2013-04-16 14:28:09.728156552 +0100
+++++ src/com/sun/org/apache/xml/internal/utils/res/XResourceBundle.java 2013-04-16 14:29:26.565394640 +0100
++@@ -22,6 +22,8 @@
++ */
++ package com.sun.org.apache.xml.internal.utils.res;
++
+++import java.security.AccessController;
+++import java.security.PrivilegedAction;
++ import java.util.ListResourceBundle;
++ import java.util.Locale;
++ import java.util.MissingResourceException;
++@@ -29,114 +31,45 @@
++
++ /**
++ * The default (english) resource bundle.
+++ *
++ * @xsl.usage internal
++ */
++-public class XResourceBundle extends ListResourceBundle
++-{
+++public class XResourceBundle extends ListResourceBundle {
++
++- /** Error resource constants */
++- public static final String ERROR_RESOURCES =
++- "com.sun.org.apache.xalan.internal.res.XSLTErrorResources", XSLT_RESOURCE =
++- "com.sun.org.apache.xml.internal.utils.res.XResourceBundle", LANG_BUNDLE_NAME =
++- "com.sun.org.apache.xml.internal.utils.res.XResources", MULT_ORDER =
++- "multiplierOrder", MULT_PRECEDES = "precedes", MULT_FOLLOWS =
++- "follows", LANG_ORIENTATION = "orientation", LANG_RIGHTTOLEFT =
++- "rightToLeft", LANG_LEFTTORIGHT = "leftToRight", LANG_NUMBERING =
++- "numbering", LANG_ADDITIVE = "additive", LANG_MULT_ADD =
++- "multiplicative-additive", LANG_MULTIPLIER =
++- "multiplier", LANG_MULTIPLIER_CHAR =
++- "multiplierChar", LANG_NUMBERGROUPS = "numberGroups", LANG_NUM_TABLES =
++- "tables", LANG_ALPHABET = "alphabet", LANG_TRAD_ALPHABET = "tradAlphabet";
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @param locale the locale to prefer when searching for the bundle
++- */
++- public static final XResourceBundle loadResourceBundle(
++- String className, Locale locale) throws MissingResourceException
++- {
++-
++- String suffix = getResourceSuffix(locale);
++-
++- //System.out.println("resource " + className + suffix);
++- try
++- {
++-
++- // first try with the given locale
++- String resourceName = className + suffix;
++- return (XResourceBundle) ResourceBundle.getBundle(resourceName, locale);
+++ /**
+++ * Error resource constants
+++ */
+++ public static final String ERROR_RESOURCES =
+++ "com.sun.org.apache.xalan.internal.res.XSLTErrorResources", XSLT_RESOURCE =
+++ "com.sun.org.apache.xml.internal.utils.res.XResourceBundle", LANG_BUNDLE_NAME =
+++ "com.sun.org.apache.xml.internal.utils.res.XResources", MULT_ORDER =
+++ "multiplierOrder", MULT_PRECEDES = "precedes", MULT_FOLLOWS =
+++ "follows", LANG_ORIENTATION = "orientation", LANG_RIGHTTOLEFT =
+++ "rightToLeft", LANG_LEFTTORIGHT = "leftToRight", LANG_NUMBERING =
+++ "numbering", LANG_ADDITIVE = "additive", LANG_MULT_ADD =
+++ "multiplicative-additive", LANG_MULTIPLIER =
+++ "multiplier", LANG_MULTIPLIER_CHAR =
+++ "multiplierChar", LANG_NUMBERGROUPS = "numberGroups", LANG_NUM_TABLES =
+++ "tables", LANG_ALPHABET = "alphabet", LANG_TRAD_ALPHABET = "tradAlphabet";
+++
+++
+++ /**
+++ * Get the association list.
+++ *
+++ * @return The association list.
+++ */
+++ public Object[][] getContents() {
+++ return new Object[][]{
+++ {"ui_language", "en"}, {"help_language", "en"}, {"language", "en"},
+++ {"alphabet", new CharArrayWrapper(new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G',
+++ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+++ 'V', 'W', 'X', 'Y', 'Z'})},
+++ {"tradAlphabet", new CharArrayWrapper(new char[]{'A', 'B', 'C', 'D', 'E', 'F',
+++ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+++ 'U', 'V', 'W', 'X', 'Y', 'Z'})},
+++ //language orientation
+++ {"orientation", "LeftToRight"},
+++ //language numbering
+++ {"numbering", "additive"},};
++ }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XResourceBundle) ResourceBundle.getBundle(
++- XSLT_RESOURCE, new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String lang = locale.getLanguage();
++- String country = locale.getCountry();
++- String variant = locale.getVariant();
++- String suffix = "_" + locale.getLanguage();
++-
++- if (lang.equals("zh"))
++- suffix += "_" + country;
++-
++- if (country.equals("JP"))
++- suffix += "_" + country + "_" + variant;
++-
++- return suffix;
++- }
++-
++- /**
++- * Get the association list.
++- *
++- * @return The association list.
++- */
++- public Object[][] getContents()
++- {
++- return new Object[][]
++- {
++- { "ui_language", "en" }, { "help_language", "en" }, { "language", "en" },
++- { "alphabet", new CharArrayWrapper(new char[]{ 'A', 'B', 'C', 'D', 'E', 'F', 'G',
++- 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
++- 'V', 'W', 'X', 'Y', 'Z' })},
++- { "tradAlphabet", new CharArrayWrapper(new char[]{ 'A', 'B', 'C', 'D', 'E', 'F',
++- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
++- 'U', 'V', 'W', 'X', 'Y', 'Z' }) },
++-
++- //language orientation
++- { "orientation", "LeftToRight" },
++-
++- //language numbering
++- { "numbering", "additive" },
++- };
++- }
++ }
++--- src/com/sun/org/apache/xml/internal/utils/TreeWalker.java 2013-04-16 14:28:09.720156422 +0100
+++++ src/com/sun/org/apache/xml/internal/utils/TreeWalker.java 2013-04-16 14:29:26.565394640 +0100
++@@ -22,6 +22,7 @@
++ */
++ package com.sun.org.apache.xml.internal.utils;
++
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++ import java.io.File;
++
++ import org.w3c.dom.Comment;
++@@ -93,7 +94,7 @@
++ else {
++ try {
++ // Bug see Bugzilla 26741
++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
+++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl");
++ }
++ catch (SecurityException se) {// user.dir not accessible from applet
++ }
++@@ -112,7 +113,7 @@
++ m_contentHandler.setDocumentLocator(m_locator);
++ try {
++ // Bug see Bugzilla 26741
++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
+++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl");
++ }
++ catch (SecurityException se){// user.dir not accessible from applet
++ }
++@@ -131,7 +132,7 @@
++ m_contentHandler.setDocumentLocator(m_locator);
++ try {
++ // Bug see Bugzilla 26741
++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
+++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl");
++ }
++ catch (SecurityException se){// user.dir not accessible from applet
++
++--- src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java 2013-04-16 14:28:09.752156937 +0100
+++++ src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java 2013-04-16 14:29:26.565394640 +0100
++@@ -31,6 +31,8 @@
++ import com.sun.org.apache.xpath.internal.objects.XObject;
++ import com.sun.org.apache.xpath.internal.objects.XString;
++ import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
+++import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
+++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++
++ /**
++ * Execute the SystemProperty() function.
++@@ -100,7 +102,7 @@
++
++ try
++ {
++- result = System.getProperty(propName);
+++ result = SecuritySupport.getSystemProperty(propName);
++
++ if (null == result)
++ {
++@@ -122,7 +124,7 @@
++ {
++ try
++ {
++- result = System.getProperty(fullName);
+++ result = SecuritySupport.getSystemProperty(fullName);
++
++ if (null == result)
++ {
++@@ -163,14 +165,12 @@
++ * should already be fully qualified as path/filename
++ * @param target The target property bag the file will be placed into.
++ */
++- private void loadPropertyFile(String file, Properties target)
+++ public void loadPropertyFile(String file, Properties target)
++ {
++ try
++ {
++ // Use SecuritySupport class to provide priveleged access to property file
++- SecuritySupport ss = SecuritySupport.getInstance();
++-
++- InputStream is = ss.getResourceAsStream(ObjectFactory.findClassLoader(),
+++ InputStream is = SecuritySupport.getResourceAsStream(ObjectFactory.findClassLoader(),
++ file);
++
++ // get a buffered version
++--- src/com/sun/org/apache/xpath/internal/functions/ObjectFactory.java 2013-04-16 14:28:09.752156937 +0100
+++++ src/com/sun/org/apache/xpath/internal/functions/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100
++@@ -1,663 +0,0 @@
++-/*
++- * reserved comment block
++- * DO NOT REMOVE OR ALTER!
++- */
++-/*
++- * Copyright 2001-2004 The Apache Software Foundation.
++- *
++- * Licensed under the Apache License, Version 2.0 (the "License");
++- * you may not use this file except in compliance with the License.
++- * You may obtain a copy of the License at
++- *
++- * http://www.apache.org/licenses/LICENSE-2.0
++- *
++- * Unless required by applicable law or agreed to in writing, software
++- * distributed under the License is distributed on an "AS IS" BASIS,
++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++- * See the License for the specific language governing permissions and
++- * limitations under the License.
++- */
++-/*
++- * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/14 20:25:54 jeffsuttor Exp $
++- */
++-
++-package com.sun.org.apache.xpath.internal.functions;
++-
++-import java.io.InputStream;
++-import java.io.IOException;
++-import java.io.File;
++-import java.io.FileInputStream;
++-
++-import java.util.Properties;
++-import java.io.BufferedReader;
++-import java.io.InputStreamReader;
++-
++-/**
++- * This class is duplicated for each JAXP subpackage so keep it in sync.
++- * It is package private and therefore is not exposed as part of the JAXP
++- * API.
++- * <p>
++- * This code is designed to implement the JAXP 1.1 spec pluggability
++- * feature and is designed to run on JDK version 1.1 and
++- * later, and to compile on JDK 1.2 and onward.
++- * The code also runs both as part of an unbundled jar file and
++- * when bundled as part of the JDK.
++- * <p>
++- * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code>
++- * class and modified to be used as a general utility for creating objects
++- * dynamically.
++- *
++- * @version $Id: ObjectFactory.java,v 1.7 2008/04/02 00:40:59 joehw Exp $
++- */
++-class ObjectFactory {
++-
++- //
++- // Constants
++- //
++-
++- // name of default properties file to look for in JDK's jre/lib directory
++- private static final String DEFAULT_PROPERTIES_FILENAME =
++- "xalan.properties";
++-
++- private static final String SERVICES_PATH = "META-INF/services/";
++-
++- /** Set to true for debugging */
++- private static final boolean DEBUG = false;
++-
++- /** cache the contents of the xalan.properties file.
++- * Until an attempt has been made to read this file, this will
++- * be null; if the file does not exist or we encounter some other error
++- * during the read, this will be empty.
++- */
++- private static Properties fXalanProperties = null;
++-
++- /***
++- * Cache the time stamp of the xalan.properties file so
++- * that we know if it's been modified and can invalidate
++- * the cache when necessary.
++- */
++- private static long fLastModified = -1;
++-
++- //
++- // Public static methods
++- //
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return instance of factory, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Object createObject(String factoryId, String fallbackClassName)
++- throws ConfigurationError {
++- return createObject(factoryId, null, fallbackClassName);
++- } // createObject(String,String):Object
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return instance of factory, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Object createObject(String factoryId,
++- String propertiesFilename,
++- String fallbackClassName)
++- throws ConfigurationError
++- {
++- Class factoryClass = lookUpFactoryClass(factoryId,
++- propertiesFilename,
++- fallbackClassName);
++-
++- if (factoryClass == null) {
++- throw new ConfigurationError(
++- "Provider for " + factoryId + " cannot be found", null);
++- }
++-
++- try{
++- Object instance = factoryClass.newInstance();
++- if (DEBUG) debugPrintln("created new instance of factory " + factoryId);
++- return instance;
++- } catch (Exception x) {
++- throw new ConfigurationError(
++- "Provider for factory " + factoryId
++- + " could not be instantiated: " + x, x);
++- }
++- } // createObject(String,String,String):Object
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return Class object of factory, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Class lookUpFactoryClass(String factoryId)
++- throws ConfigurationError
++- {
++- return lookUpFactoryClass(factoryId, null, null);
++- } // lookUpFactoryClass(String):Class
++-
++- /**
++- * Finds the implementation Class object in the specified order. The
++- * specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return Class object that provides factory service, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static Class lookUpFactoryClass(String factoryId,
++- String propertiesFilename,
++- String fallbackClassName)
++- throws ConfigurationError
++- {
++- String factoryClassName = lookUpFactoryClassName(factoryId,
++- propertiesFilename,
++- fallbackClassName);
++- ClassLoader cl = findClassLoader();
++-
++- if (factoryClassName == null) {
++- factoryClassName = fallbackClassName;
++- }
++-
++- // assert(className != null);
++- try{
++- Class providerClass = findProviderClass(factoryClassName,
++- cl,
++- true);
++- if (DEBUG) debugPrintln("created new instance of " + providerClass +
++- " using ClassLoader: " + cl);
++- return providerClass;
++- } catch (ClassNotFoundException x) {
++- throw new ConfigurationError(
++- "Provider " + factoryClassName + " not found", x);
++- } catch (Exception x) {
++- throw new ConfigurationError(
++- "Provider "+factoryClassName+" could not be instantiated: "+x,
++- x);
++- }
++- } // lookUpFactoryClass(String,String,String):Class
++-
++- /**
++- * Finds the name of the required implementation class in the specified
++- * order. The specified order is the following:
++- * <ol>
++- * <li>query the system property using <code>System.getProperty</code>
++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file
++- * <li>use fallback classname
++- * </ol>
++- *
++- * @return name of class that provides factory service, never null
++- *
++- * @param factoryId Name of the factory to find, same as
++- * a property name
++- * @param propertiesFilename The filename in the $java.home/lib directory
++- * of the properties file. If none specified,
++- * ${java.home}/lib/xalan.properties will be used.
++- * @param fallbackClassName Implementation class name, if nothing else
++- * is found. Use null to mean no fallback.
++- *
++- * @exception ObjectFactory.ConfigurationError
++- */
++- static String lookUpFactoryClassName(String factoryId,
++- String propertiesFilename,
++- String fallbackClassName)
++- {
++- SecuritySupport ss = SecuritySupport.getInstance();
++-
++- // Use the system property first
++- try {
++- String systemProp = ss.getSystemProperty(factoryId);
++- if (systemProp != null) {
++- if (DEBUG) debugPrintln("found system property, value=" + systemProp);
++- return systemProp;
++- }
++- } catch (SecurityException se) {
++- // Ignore and continue w/ next location
++- }
++-
++- // Try to read from propertiesFilename, or
++- // $java.home/lib/xalan.properties
++- String factoryClassName = null;
++- // no properties file name specified; use
++- // $JAVA_HOME/lib/xalan.properties:
++- if (propertiesFilename == null) {
++- File propertiesFile = null;
++- boolean propertiesFileExists = false;
++- try {
++- String javah = ss.getSystemProperty("java.home");
++- propertiesFilename = javah + File.separator +
++- "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;
++- propertiesFile = new File(propertiesFilename);
++- propertiesFileExists = ss.getFileExists(propertiesFile);
++- } catch (SecurityException e) {
++- // try again...
++- fLastModified = -1;
++- fXalanProperties = null;
++- }
++-
++- synchronized (ObjectFactory.class) {
++- boolean loadProperties = false;
++- FileInputStream fis = null;
++- try {
++- // file existed last time
++- if(fLastModified >= 0) {
++- if(propertiesFileExists &&
++- (fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) {
++- loadProperties = true;
++- } else {
++- // file has stopped existing...
++- if(!propertiesFileExists) {
++- fLastModified = -1;
++- fXalanProperties = null;
++- } // else, file wasn't modified!
++- }
++- } else {
++- // file has started to exist:
++- if(propertiesFileExists) {
++- loadProperties = true;
++- fLastModified = ss.getLastModified(propertiesFile);
++- } // else, nothing's changed
++- }
++- if(loadProperties) {
++- // must never have attempted to read xalan.properties
++- // before (or it's outdeated)
++- fXalanProperties = new Properties();
++- fis = ss.getFileInputStream(propertiesFile);
++- fXalanProperties.load(fis);
++- }
++- } catch (Exception x) {
++- fXalanProperties = null;
++- fLastModified = -1;
++- // assert(x instanceof FileNotFoundException
++- // || x instanceof SecurityException)
++- // In both cases, ignore and continue w/ next location
++- }
++- finally {
++- // try to close the input stream if one was opened.
++- if (fis != null) {
++- try {
++- fis.close();
++- }
++- // Ignore the exception.
++- catch (IOException exc) {}
++- }
++- }
++- }
++- if(fXalanProperties != null) {
++- factoryClassName = fXalanProperties.getProperty(factoryId);
++- }
++- } else {
++- FileInputStream fis = null;
++- try {
++- fis = ss.getFileInputStream(new File(propertiesFilename));
++- Properties props = new Properties();
++- props.load(fis);
++- factoryClassName = props.getProperty(factoryId);
++- } catch (Exception x) {
++- // assert(x instanceof FileNotFoundException
++- // || x instanceof SecurityException)
++- // In both cases, ignore and continue w/ next location
++- }
++- finally {
++- // try to close the input stream if one was opened.
++- if (fis != null) {
++- try {
++- fis.close();
++- }
++- // Ignore the exception.
++- catch (IOException exc) {}
++- }
++- }
++- }
++- if (factoryClassName != null) {
++- if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value="
++- + factoryClassName);
++- return factoryClassName;
++- }
++-
++- // Try Jar Service Provider Mechanism
++- return findJarServiceProviderName(factoryId);
++- } // lookUpFactoryClass(String,String):String
++-
++- //
++- // Private static methods
++- //
++-
++- /** Prints a message to standard error if debugging is enabled. */
++- private static void debugPrintln(String msg) {
++- if (DEBUG) {
++- System.err.println("JAXP: " + msg);
++- }
++- } // debugPrintln(String)
++-
++- /**
++- * Figure out which ClassLoader to use. For JDK 1.2 and later use
++- * the context ClassLoader.
++- */
++- static ClassLoader findClassLoader()
++- throws ConfigurationError
++- {
++- SecuritySupport ss = SecuritySupport.getInstance();
++-
++- // Figure out which ClassLoader to use for loading the provider
++- // class. If there is a Context ClassLoader then use it.
++- ClassLoader context = ss.getContextClassLoader();
++- ClassLoader system = ss.getSystemClassLoader();
++-
++- ClassLoader chain = system;
++- while (true) {
++- if (context == chain) {
++- // Assert: we are on JDK 1.1 or we have no Context ClassLoader
++- // or any Context ClassLoader in chain of system classloader
++- // (including extension ClassLoader) so extend to widest
++- // ClassLoader (always look in system ClassLoader if Xalan
++- // is in boot/extension/system classpath and in current
++- // ClassLoader otherwise); normal classloaders delegate
++- // back to system ClassLoader first so this widening doesn't
++- // change the fact that context ClassLoader will be consulted
++- ClassLoader current = ObjectFactory.class.getClassLoader();
++-
++- chain = system;
++- while (true) {
++- if (current == chain) {
++- // Assert: Current ClassLoader in chain of
++- // boot/extension/system ClassLoaders
++- return system;
++- }
++- if (chain == null) {
++- break;
++- }
++- chain = ss.getParentClassLoader(chain);
++- }
++-
++- // Assert: Current ClassLoader not in chain of
++- // boot/extension/system ClassLoaders
++- return current;
++- }
++-
++- if (chain == null) {
++- // boot ClassLoader reached
++- break;
++- }
++-
++- // Check for any extension ClassLoaders in chain up to
++- // boot ClassLoader
++- chain = ss.getParentClassLoader(chain);
++- };
++-
++- // Assert: Context ClassLoader not in chain of
++- // boot/extension/system ClassLoaders
++- return context;
++- } // findClassLoader():ClassLoader
++-
++- /**
++- * Create an instance of a class using the specified ClassLoader
++- */
++- static Object newInstance(String className, ClassLoader cl,
++- boolean doFallback)
++- throws ConfigurationError
++- {
++- // assert(className != null);
++- try{
++- Class providerClass = findProviderClass(className, cl, doFallback);
++- Object instance = providerClass.newInstance();
++- if (DEBUG) debugPrintln("created new instance of " + providerClass +
++- " using ClassLoader: " + cl);
++- return instance;
++- } catch (ClassNotFoundException x) {
++- throw new ConfigurationError(
++- "Provider " + className + " not found", x);
++- } catch (Exception x) {
++- throw new ConfigurationError(
++- "Provider " + className + " could not be instantiated: " + x,
++- x);
++- }
++- }
++-
++- /**
++- * Find a Class using the specified ClassLoader
++- */
++- static Class findProviderClass(String className, ClassLoader cl,
++- boolean doFallback)
++- throws ClassNotFoundException, ConfigurationError
++- {
++- //throw security exception if the calling thread is not allowed to access the
++- //class. Restrict the access to the package classes as specified in java.security policy.
++- SecurityManager security = System.getSecurityManager();
++- try{
++- if (security != null){
++- final int lastDot = className.lastIndexOf(".");
++- String packageName = className;
++- if (lastDot != -1) packageName = className.substring(0, lastDot);
++- security.checkPackageAccess(packageName);
++- }
++- }catch(SecurityException e){
++- throw e;
++- }
++-
++- Class providerClass;
++- if (cl == null) {
++- // XXX Use the bootstrap ClassLoader. There is no way to
++- // load a class using the bootstrap ClassLoader that works
++- // in both JDK 1.1 and Java 2. However, this should still
++- // work b/c the following should be true:
++- //
++- // (cl == null) iff current ClassLoader == null
++- //
++- // Thus Class.forName(String) will use the current
++- // ClassLoader which will be the bootstrap ClassLoader.
++- providerClass = Class.forName(className);
++- } else {
++- try {
++- providerClass = cl.loadClass(className);
++- } catch (ClassNotFoundException x) {
++- if (doFallback) {
++- // Fall back to current classloader
++- ClassLoader current = ObjectFactory.class.getClassLoader();
++- if (current == null) {
++- providerClass = Class.forName(className);
++- } else if (cl != current) {
++- cl = current;
++- providerClass = cl.loadClass(className);
++- } else {
++- throw x;
++- }
++- } else {
++- throw x;
++- }
++- }
++- }
++-
++- return providerClass;
++- }
++-
++- /**
++- * Find the name of service provider using Jar Service Provider Mechanism
++- *
++- * @return instance of provider class if found or null
++- */
++- private static String findJarServiceProviderName(String factoryId)
++- {
++- SecuritySupport ss = SecuritySupport.getInstance();
++- String serviceId = SERVICES_PATH + factoryId;
++- InputStream is = null;
++-
++- // First try the Context ClassLoader
++- ClassLoader cl = findClassLoader();
++-
++- is = ss.getResourceAsStream(cl, serviceId);
++-
++- // If no provider found then try the current ClassLoader
++- if (is == null) {
++- ClassLoader current = ObjectFactory.class.getClassLoader();
++- if (cl != current) {
++- cl = current;
++- is = ss.getResourceAsStream(cl, serviceId);
++- }
++- }
++-
++- if (is == null) {
++- // No provider found
++- return null;
++- }
++-
++- if (DEBUG) debugPrintln("found jar resource=" + serviceId +
++- " using ClassLoader: " + cl);
++-
++- // Read the service provider name in UTF-8 as specified in
++- // the jar spec. Unfortunately this fails in Microsoft
++- // VJ++, which does not implement the UTF-8
++- // encoding. Theoretically, we should simply let it fail in
++- // that case, since the JVM is obviously broken if it
++- // doesn't support such a basic standard. But since there
++- // are still some users attempting to use VJ++ for
++- // development, we have dropped in a fallback which makes a
++- // second attempt using the platform's default encoding. In
++- // VJ++ this is apparently ASCII, which is a subset of
++- // UTF-8... and since the strings we'll be reading here are
++- // also primarily limited to the 7-bit ASCII range (at
++- // least, in English versions), this should work well
++- // enough to keep us on the air until we're ready to
++- // officially decommit from VJ++. [Edited comment from
++- // jkesselm]
++- BufferedReader rd;
++- try {
++- rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
++- } catch (java.io.UnsupportedEncodingException e) {
++- rd = new BufferedReader(new InputStreamReader(is));
++- }
++-
++- String factoryClassName = null;
++- try {
++- // XXX Does not handle all possible input as specified by the
++- // Jar Service Provider specification
++- factoryClassName = rd.readLine();
++- } catch (IOException x) {
++- // No provider found
++- return null;
++- }
++- finally {
++- try {
++- // try to close the reader.
++- rd.close();
++- }
++- // Ignore the exception.
++- catch (IOException exc) {}
++- }
++-
++- if (factoryClassName != null &&
++- ! "".equals(factoryClassName)) {
++- if (DEBUG) debugPrintln("found in resource, value="
++- + factoryClassName);
++-
++- // Note: here we do not want to fall back to the current
++- // ClassLoader because we want to avoid the case where the
++- // resource file was found using one ClassLoader and the
++- // provider class was instantiated using a different one.
++- return factoryClassName;
++- }
++-
++- // No provider found
++- return null;
++- }
++-
++- //
++- // Classes
++- //
++-
++- /**
++- * A configuration error.
++- */
++- static class ConfigurationError
++- extends Error {
++- static final long serialVersionUID = -5782303800588797207L;
++- //
++- // Data
++- //
++-
++- /** Exception. */
++- private Exception exception;
++-
++- //
++- // Constructors
++- //
++-
++- /**
++- * Construct a new instance with the specified detail string and
++- * exception.
++- */
++- ConfigurationError(String msg, Exception x) {
++- super(msg);
++- this.exception = x;
++- } // <init>(String,Exception)
++-
++- //
++- // Public methods
++- //
++-
++- /** Returns the exception associated to this error. */
++- Exception getException() {
++- return exception;
++- } // getException():Exception
++-
++- } // class ConfigurationError
++-
++-} // class ObjectFactory
++--- src/com/sun/org/apache/xpath/internal/functions/SecuritySupport12.java 2013-04-16 14:28:09.752156937 +0100
+++++ src/com/sun/org/apache/xpath/internal/functions/SecuritySupport12.java 1970-01-01 01:00:00.000000000 +0100
++@@ -1,148 +0,0 @@
++-/*
++- * reserved comment block
++- * DO NOT REMOVE OR ALTER!
++- */
++-/*
++- * Copyright 2002-2004 The Apache Software Foundation.
++- *
++- * Licensed under the Apache License, Version 2.0 (the "License");
++- * you may not use this file except in compliance with the License.
++- * You may obtain a copy of the License at
++- *
++- * http://www.apache.org/licenses/LICENSE-2.0
++- *
++- * Unless required by applicable law or agreed to in writing, software
++- * distributed under the License is distributed on an "AS IS" BASIS,
++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++- * See the License for the specific language governing permissions and
++- * limitations under the License.
++- */
++-/*
++- * $Id: SecuritySupport12.java,v 1.1.2.1 2005/08/01 01:29:45 jeffsuttor Exp $
++- */
++-
++-package com.sun.org.apache.xpath.internal.functions;
++-
++-import java.io.File;
++-import java.io.FileInputStream;
++-import java.io.FileNotFoundException;
++-import java.io.InputStream;
++-
++-import java.security.AccessController;
++-import java.security.PrivilegedAction;
++-import java.security.PrivilegedActionException;
++-import java.security.PrivilegedExceptionAction;
++-
++-import java.util.Properties;
++-
++-/**
++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync.
++- * It is package private and therefore is not exposed as part of the Xalan-Java
++- * API.
++- *
++- * Security related methods that only work on J2SE 1.2 and newer.
++- */
++-class SecuritySupport12 extends SecuritySupport {
++-
++- ClassLoader getContextClassLoader() {
++- return (ClassLoader)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- ClassLoader cl = null;
++- try {
++- cl = Thread.currentThread().getContextClassLoader();
++- } catch (SecurityException ex) { }
++- return cl;
++- }
++- });
++- }
++-
++- ClassLoader getSystemClassLoader() {
++- return (ClassLoader)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- ClassLoader cl = null;
++- try {
++- cl = ClassLoader.getSystemClassLoader();
++- } catch (SecurityException ex) {}
++- return cl;
++- }
++- });
++- }
++-
++- ClassLoader getParentClassLoader(final ClassLoader cl) {
++- return (ClassLoader)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- ClassLoader parent = null;
++- try {
++- parent = cl.getParent();
++- } catch (SecurityException ex) {}
++-
++- // eliminate loops in case of the boot
++- // ClassLoader returning itself as a parent
++- return (parent == cl) ? null : parent;
++- }
++- });
++- }
++-
++- String getSystemProperty(final String propName) {
++- return (String)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- return System.getProperty(propName);
++- }
++- });
++- }
++-
++- FileInputStream getFileInputStream(final File file)
++- throws FileNotFoundException
++- {
++- try {
++- return (FileInputStream)
++- AccessController.doPrivileged(new PrivilegedExceptionAction() {
++- public Object run() throws FileNotFoundException {
++- return new FileInputStream(file);
++- }
++- });
++- } catch (PrivilegedActionException e) {
++- throw (FileNotFoundException)e.getException();
++- }
++- }
++-
++- InputStream getResourceAsStream(final ClassLoader cl,
++- final String name)
++- {
++- return (InputStream)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- InputStream ris;
++- if (cl == null) {
++- ris = ClassLoader.getSystemResourceAsStream(name);
++- } else {
++- ris = cl.getResourceAsStream(name);
++- }
++- return ris;
++- }
++- });
++- }
++-
++- boolean getFileExists(final File f) {
++- return ((Boolean)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- return new Boolean(f.exists());
++- }
++- })).booleanValue();
++- }
++-
++- long getLastModified(final File f) {
++- return ((Long)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- return new Long(f.lastModified());
++- }
++- })).longValue();
++- }
++-
++-}
++--- src/com/sun/org/apache/xpath/internal/functions/SecuritySupport.java 2013-04-16 14:28:09.752156937 +0100
+++++ src/com/sun/org/apache/xpath/internal/functions/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100
++@@ -1,127 +0,0 @@
++-/*
++- * reserved comment block
++- * DO NOT REMOVE OR ALTER!
++- */
++-/*
++- * Copyright 2002-2004 The Apache Software Foundation.
++- *
++- * Licensed under the Apache License, Version 2.0 (the "License");
++- * you may not use this file except in compliance with the License.
++- * You may obtain a copy of the License at
++- *
++- * http://www.apache.org/licenses/LICENSE-2.0
++- *
++- * Unless required by applicable law or agreed to in writing, software
++- * distributed under the License is distributed on an "AS IS" BASIS,
++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++- * See the License for the specific language governing permissions and
++- * limitations under the License.
++- */
++-/*
++- * $Id: SecuritySupport.java,v 1.1.2.1 2005/08/01 01:29:39 jeffsuttor Exp $
++- */
++-
++-package com.sun.org.apache.xpath.internal.functions;
++-
++-import java.io.File;
++-import java.io.FileInputStream;
++-import java.io.FileNotFoundException;
++-import java.io.InputStream;
++-
++-import java.util.Properties;
++-
++-/**
++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync.
++- * It is package private and therefore is not exposed as part of the Xalan-Java
++- * API.
++- *
++- * Base class with security related methods that work on JDK 1.1.
++- */
++-class SecuritySupport {
++-
++- /*
++- * Make this of type Object so that the verifier won't try to
++- * prove its type, thus possibly trying to load the SecuritySupport12
++- * class.
++- */
++- private static final Object securitySupport;
++-
++- static {
++- SecuritySupport ss = null;
++- try {
++- Class c = Class.forName("java.security.AccessController");
++- // if that worked, we're on 1.2.
++- /*
++- // don't reference the class explicitly so it doesn't
++- // get dragged in accidentally.
++- c = Class.forName("javax.mail.SecuritySupport12");
++- Constructor cons = c.getConstructor(new Class[] { });
++- ss = (SecuritySupport)cons.newInstance(new Object[] { });
++- */
++- /*
++- * Unfortunately, we can't load the class using reflection
++- * because the class is package private. And the class has
++- * to be package private so the APIs aren't exposed to other
++- * code that could use them to circumvent security. Thus,
++- * we accept the risk that the direct reference might fail
++- * on some JDK 1.1 JVMs, even though we would never execute
++- * this code in such a case. Sigh...
++- */
++- ss = new SecuritySupport12();
++- } catch (Exception ex) {
++- // ignore it
++- } finally {
++- if (ss == null)
++- ss = new SecuritySupport();
++- securitySupport = ss;
++- }
++- }
++-
++- /**
++- * Return an appropriate instance of this class, depending on whether
++- * we're on a JDK 1.1 or J2SE 1.2 (or later) system.
++- */
++- static SecuritySupport getInstance() {
++- return (SecuritySupport)securitySupport;
++- }
++-
++- ClassLoader getContextClassLoader() {
++- return null;
++- }
++-
++- ClassLoader getSystemClassLoader() {
++- return null;
++- }
++-
++- ClassLoader getParentClassLoader(ClassLoader cl) {
++- return null;
++- }
++-
++- String getSystemProperty(String propName) {
++- return System.getProperty(propName);
++- }
++-
++- FileInputStream getFileInputStream(File file)
++- throws FileNotFoundException
++- {
++- return new FileInputStream(file);
++- }
++-
++- InputStream getResourceAsStream(ClassLoader cl, String name) {
++- InputStream ris;
++- if (cl == null) {
++- ris = ClassLoader.getSystemResourceAsStream(name);
++- } else {
++- ris = cl.getResourceAsStream(name);
++- }
++- return ris;
++- }
++-
++- boolean getFileExists(File f) {
++- return f.exists();
++- }
++-
++- long getLastModified(File f) {
++- return f.lastModified();
++- }
++-}
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java 2013-04-16 14:28:09.764157131 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1269,68 +1266,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "MUSTER ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_es.java 2013-04-16 14:28:09.764157131 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_es.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1273,68 +1270,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("es", "ES"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_fr.java 2013-04-16 14:28:09.768157196 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_fr.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1270,68 +1267,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_it.java 2013-04-16 14:28:09.768157196 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_it.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1272,68 +1269,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "MODELLO ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("it", "IT"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ja.java 2013-04-16 14:28:09.768157196 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ja.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1269,68 +1266,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "\u30d1\u30bf\u30fc\u30f3 ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java 2013-04-16 14:28:09.764157131 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -938,68 +935,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("en", "US"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ko.java 2013-04-16 14:28:09.768157196 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ko.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1269,68 +1266,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("ko", "KR"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_CN.java 2013-04-16 14:28:09.772157260 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_CN.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1270,68 +1267,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("zh", "CN"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "\u65e0\u6cd5\u88c5\u5165\u4efb\u4f55\u8d44\u6e90\u5305\u3002", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_TW.java 2013-04-16 14:28:09.772157260 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_TW.java 2013-04-16 14:29:26.565394640 +0100
++@@ -23,9 +23,6 @@
++ package com.sun.org.apache.xpath.internal.res;
++
++ import java.util.ListResourceBundle;
++-import java.util.Locale;
++-import java.util.MissingResourceException;
++-import java.util.ResourceBundle;
++
++ /**
++ * Set up error messages.
++@@ -1270,68 +1267,4 @@
++ /** Field QUERY_HEADER */
++ public static final String QUERY_HEADER = "PATTERN ";
++
++-
++- /**
++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior
++- * of ResourceBundle.getBundle().
++- *
++- * @param className Name of local-specific subclass.
++- * @return the ResourceBundle
++- * @throws MissingResourceException
++- */
++- public static final XPATHErrorResources loadResourceBundle(String className)
++- throws MissingResourceException
++- {
++-
++- Locale locale = Locale.getDefault();
++- String suffix = getResourceSuffix(locale);
++-
++- try
++- {
++-
++- // first try with the given locale
++- return (XPATHErrorResources) ResourceBundle.getBundle(className
++- + suffix, locale);
++- }
++- catch (MissingResourceException e)
++- {
++- try // try to fall back to en_US if we can't load
++- {
++-
++- // Since we can't find the localized property file,
++- // fall back to en_US.
++- return (XPATHErrorResources) ResourceBundle.getBundle(className,
++- new Locale("zh", "TW"));
++- }
++- catch (MissingResourceException e2)
++- {
++-
++- // Now we are really in trouble.
++- // very bad, definitely very bad...not going to get very far
++- throw new MissingResourceException(
++- "Could not load any resource bundles.", className, "");
++- }
++- }
++- }
++-
++- /**
++- * Return the resource file suffic for the indicated locale
++- * For most locales, this will be based the language code. However
++- * for Chinese, we do distinguish between Taiwan and PRC
++- *
++- * @param locale the locale
++- * @return an String suffix which canbe appended to a resource name
++- */
++- private static final String getResourceSuffix(Locale locale)
++- {
++-
++- String suffix = "_" + locale.getLanguage();
++- String country = locale.getCountry();
++-
++- if (country.equals("TW"))
++- suffix += "_" + country;
++-
++- return suffix;
++- }
++-
++ }
++--- src/com/sun/org/apache/xpath/internal/res/XPATHMessages.java 2013-04-16 14:28:09.772157260 +0100
+++++ src/com/sun/org/apache/xpath/internal/res/XPATHMessages.java 2013-04-16 14:29:26.569394704 +0100
++@@ -22,130 +22,128 @@
++ */
++ package com.sun.org.apache.xpath.internal.res;
++
++-import java.util.ListResourceBundle;
++-
+++import com.sun.org.apache.bcel.internal.util.SecuritySupport;
++ import com.sun.org.apache.xml.internal.res.XMLMessages;
+++import java.util.ListResourceBundle;
++
++ /**
++ * A utility class for issuing XPath error messages.
+++ *
++ * @xsl.usage internal
++ */
++-public class XPATHMessages extends XMLMessages
++-{
++- /** The language specific resource object for XPath messages. */
++- private static ListResourceBundle XPATHBundle = null;
++-
++- /** The class name of the XPath error message string table. */
++- private static final String XPATH_ERROR_RESOURCES =
++- "com.sun.org.apache.xpath.internal.res.XPATHErrorResources";
++-
++- /**
++- * Creates a message from the specified key and replacement
++- * arguments, localized to the given locale.
++- *
++- * @param msgKey The key for the message text.
++- * @param args The arguments to be used as replacement text
++- * in the message created.
++- *
++- * @return The formatted message string.
++- */
++- public static final String createXPATHMessage(String msgKey, Object args[]) //throws Exception
++- {
++- if (XPATHBundle == null)
++- XPATHBundle = loadResourceBundle(XPATH_ERROR_RESOURCES);
+++public class XPATHMessages extends XMLMessages {
++
++- if (XPATHBundle != null)
+++ /**
+++ * The language specific resource object for XPath messages.
+++ */
+++ private static ListResourceBundle XPATHBundle = null;
+++ /**
+++ * The class name of the XPath error message string table.
+++ */
+++ private static final String XPATH_ERROR_RESOURCES =
+++ "com.sun.org.apache.xpath.internal.res.XPATHErrorResources";
+++
+++ /**
+++ * Creates a message from the specified key and replacement arguments,
+++ * localized to the given locale.
+++ *
+++ * @param msgKey The key for the message text.
+++ * @param args The arguments to be used as replacement text in the message
+++ * created.
+++ *
+++ * @return The formatted message string.
+++ */
+++ public static final String createXPATHMessage(String msgKey, Object args[]) //throws Exception
++ {
++- return createXPATHMsg(XPATHBundle, msgKey, args);
++- }
++- else
++- return "Could not load any resource bundles.";
++- }
++-
++- /**
++- * Creates a message from the specified key and replacement
++- * arguments, localized to the given locale.
++- *
++- * @param msgKey The key for the message text.
++- * @param args The arguments to be used as replacement text
++- * in the message created.
++- *
++- * @return The formatted warning string.
++- */
++- public static final String createXPATHWarning(String msgKey, Object args[]) //throws Exception
++- {
++- if (XPATHBundle == null)
++- XPATHBundle = loadResourceBundle(XPATH_ERROR_RESOURCES);
+++ if (XPATHBundle == null) {
+++ XPATHBundle = SecuritySupport.getResourceBundle(XPATH_ERROR_RESOURCES);
+++ }
++
++- if (XPATHBundle != null)
++- {
++- return createXPATHMsg(XPATHBundle, msgKey, args);
+++ if (XPATHBundle != null) {
+++ return createXPATHMsg(XPATHBundle, msgKey, args);
+++ } else {
+++ return "Could not load any resource bundles.";
+++ }
++ }
++- else
++- return "Could not load any resource bundles.";
++- }
++-
++- /**
++- * Creates a message from the specified key and replacement
++- * arguments, localized to the given locale.
++- *
++- * @param fResourceBundle The resource bundle to use.
++- * @param msgKey The message key to use.
++- * @param args The arguments to be used as replacement text
++- * in the message created.
++- *
++- * @return The formatted message string.
++- */
++- public static final String createXPATHMsg(ListResourceBundle fResourceBundle,
++- String msgKey, Object args[]) //throws Exception
++- {
++-
++- String fmsg = null;
++- boolean throwex = false;
++- String msg = null;
++-
++- if (msgKey != null)
++- msg = fResourceBundle.getString(msgKey);
++
++- if (msg == null)
+++ /**
+++ * Creates a message from the specified key and replacement arguments,
+++ * localized to the given locale.
+++ *
+++ * @param msgKey The key for the message text.
+++ * @param args The arguments to be used as replacement text in the message
+++ * created.
+++ *
+++ * @return The formatted warning string.
+++ */
+++ public static final String createXPATHWarning(String msgKey, Object args[]) //throws Exception
++ {
++- msg = fResourceBundle.getString(XPATHErrorResources.BAD_CODE);
++- throwex = true;
+++ if (XPATHBundle == null) {
+++ XPATHBundle = SecuritySupport.getResourceBundle(XPATH_ERROR_RESOURCES);
+++ }
+++
+++ if (XPATHBundle != null) {
+++ return createXPATHMsg(XPATHBundle, msgKey, args);
+++ } else {
+++ return "Could not load any resource bundles.";
+++ }
++ }
++
++- if (args != null)
+++ /**
+++ * Creates a message from the specified key and replacement arguments,
+++ * localized to the given locale.
+++ *
+++ * @param fResourceBundle The resource bundle to use.
+++ * @param msgKey The message key to use.
+++ * @param args The arguments to be used as replacement text in the message
+++ * created.
+++ *
+++ * @return The formatted message string.
+++ */
+++ public static final String createXPATHMsg(ListResourceBundle fResourceBundle,
+++ String msgKey, Object args[]) //throws Exception
++ {
++- try
++- {
++
++- // Do this to keep format from crying.
++- // This is better than making a bunch of conditional
++- // code all over the place.
++- int n = args.length;
++-
++- for (int i = 0; i < n; i++)
++- {
++- if (null == args[i])
++- args[i] = "";
++- }
++-
++- fmsg = java.text.MessageFormat.format(msg, args);
++- }
++- catch (Exception e)
++- {
++- fmsg = fResourceBundle.getString(XPATHErrorResources.FORMAT_FAILED);
++- fmsg += " " + msg;
++- }
++- }
++- else
++- fmsg = msg;
+++ String fmsg = null;
+++ boolean throwex = false;
+++ String msg = null;
++
++- if (throwex)
++- {
++- throw new RuntimeException(fmsg);
++- }
+++ if (msgKey != null) {
+++ msg = fResourceBundle.getString(msgKey);
+++ }
+++
+++ if (msg == null) {
+++ msg = fResourceBundle.getString(XPATHErrorResources.BAD_CODE);
+++ throwex = true;
+++ }
++
++- return fmsg;
++- }
+++ if (args != null) {
+++ try {
++
+++ // Do this to keep format from crying.
+++ // This is better than making a bunch of conditional
+++ // code all over the place.
+++ int n = args.length;
+++
+++ for (int i = 0; i < n; i++) {
+++ if (null == args[i]) {
+++ args[i] = "";
+++ }
+++ }
+++
+++ fmsg = java.text.MessageFormat.format(msg, args);
+++ } catch (Exception e) {
+++ fmsg = fResourceBundle.getString(XPATHErrorResources.FORMAT_FAILED);
+++ fmsg += " " + msg;
+++ }
+++ } else {
+++ fmsg = msg;
+++ }
+++
+++ if (throwex) {
+++ throw new RuntimeException(fmsg);
+++ }
+++
+++ return fmsg;
+++ }
++ }
++--- src/com/sun/xml/internal/stream/writers/WriterUtility.java 2013-04-16 14:28:09.780157389 +0100
+++++ src/com/sun/xml/internal/stream/writers/WriterUtility.java 2013-04-16 14:29:26.569394704 +0100
++@@ -32,6 +32,7 @@
++ import java.nio.charset.Charset;
++ import java.nio.charset.CharsetEncoder;
++ import com.sun.org.apache.xerces.internal.util.XMLChar;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++
++ /**
++ * Implements common xml writer functions.
++@@ -240,7 +241,7 @@
++
++ private CharsetEncoder getDefaultEncoder(){
++ try{
++- String encoding = System.getProperty("file.encoding");
+++ String encoding = SecuritySupport.getSystemProperty("file.encoding");
++ if(encoding != null){
++ return Charset.forName(encoding).newEncoder();
++ }
++--- src/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java 2013-04-16 14:28:09.780157389 +0100
+++++ src/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java 2013-04-16 14:29:26.569394704 +0100
++@@ -53,6 +53,7 @@
++ import com.sun.org.apache.xerces.internal.impl.PropertyManager;
++ import com.sun.org.apache.xerces.internal.util.NamespaceSupport;
++ import com.sun.org.apache.xerces.internal.util.SymbolTable;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++ import com.sun.org.apache.xerces.internal.xni.QName;
++
++ import com.sun.xml.internal.stream.util.ReadOnlyIterator;
++@@ -339,7 +340,7 @@
++ fEncoder = Charset.forName(encoding).newEncoder();
++ }
++ } else {
++- encoding = System.getProperty("file.encoding");
+++ encoding = SecuritySupport.getSystemProperty("file.encoding");
++ if (encoding != null && encoding.equalsIgnoreCase("utf-8")) {
++ fWriter = new UTF8OutputStreamWriter(os);
++ } else {
++--- src/com/sun/xml/internal/stream/XMLEntityStorage.java 2013-04-16 14:28:09.772157260 +0100
+++++ src/com/sun/xml/internal/stream/XMLEntityStorage.java 2013-04-16 14:29:26.569394704 +0100
++@@ -36,6 +36,7 @@
++ import com.sun.org.apache.xerces.internal.impl.PropertyManager;
++ import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
++ import com.sun.org.apache.xerces.internal.impl.Constants;
+++import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
++
++ /**
++ *
++@@ -410,7 +411,7 @@
++ // get the user.dir property
++ String userDir = "";
++ try {
++- userDir = System.getProperty("user.dir");
+++ userDir = SecuritySupport.getSystemProperty("user.dir");
++ }
++ catch (SecurityException se) {
++ }
++--- src/javax/xml/datatype/FactoryFinder.java 2013-04-16 14:28:09.784157453 +0100
+++++ src/javax/xml/datatype/FactoryFinder.java 2013-04-16 14:29:26.569394704 +0100
++@@ -44,6 +44,7 @@
++ * @author Santiago.PericasGeertsen@sun.com
++ */
++ class FactoryFinder {
+++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal";
++
++ /**
++ * Internal debug flag.
++@@ -95,18 +96,24 @@
++ * If the class loader supplied is <code>null</code>, first try using the
++ * context class loader followed by the current (i.e. bootstrap) class
++ * loader.
+++ *
+++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true
++ */
++ static private Class getProviderClass(String className, ClassLoader cl,
++- boolean doFallback) throws ClassNotFoundException
+++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException
++ {
++ try {
++ if (cl == null) {
++- cl = ss.getContextClassLoader();
++- if (cl == null) {
++- throw new ClassNotFoundException();
++- }
++- else {
++- return cl.loadClass(className);
+++ if (useBSClsLoader) {
+++ return Class.forName(className, true, FactoryFinder.class.getClassLoader());
+++ } else {
+++ cl = ss.getContextClassLoader();
+++ if (cl == null) {
+++ throw new ClassNotFoundException();
+++ }
+++ else {
+++ return cl.loadClass(className);
+++ }
++ }
++ }
++ else {
++@@ -131,8 +138,8 @@
++ * @param className Name of the concrete class corresponding to the
++ * service provider
++ *
++- * @param cl ClassLoader to use to load the class, null means to use
++- * the bootstrap ClassLoader
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
++ *
++ * @param doFallback True if the current ClassLoader should be tried as
++ * a fallback if the class is not found using cl
++@@ -140,8 +147,38 @@
++ static Object newInstance(String className, ClassLoader cl, boolean doFallback)
++ throws ConfigurationError
++ {
+++ return newInstance(className, cl, doFallback, false);
+++ }
+++
+++ /**
+++ * Create an instance of a class. Delegates to method
+++ * <code>getProviderClass()</code> in order to load the class.
+++ *
+++ * @param className Name of the concrete class corresponding to the
+++ * service provider
+++ *
+++ * @param cl ClassLoader to use to load the class, null means to use
+++ * the bootstrap ClassLoader
+++ *
+++ * @param doFallback True if the current ClassLoader should be tried as
+++ * a fallback if the class is not found using cl
+++ *
+++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter
+++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader.
+++ */
+++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader)
+++ throws ConfigurationError
+++ {
+++ // make sure we have access to restricted packages
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ cl = null;
+++ useBSClsLoader = true;
+++ }
+++ }
+++
++ try {
++- Class providerClass = getProviderClass(className, cl, doFallback);
+++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader);
++ Object instance = providerClass.newInstance();
++ if (debug) { // Extra check to avoid computing cl strings
++ dPrint("created new instance of " + providerClass +
++@@ -244,6 +281,7 @@
++
++ // First try the Context ClassLoader
++ ClassLoader cl = ss.getContextClassLoader();
+++ boolean useBSClsLoader = false;
++ if (cl != null) {
++ is = ss.getResourceAsStream(cl, serviceId);
++
++@@ -251,11 +289,13 @@
++ if (is == null) {
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++ } else {
++ // No Context ClassLoader, try the current ClassLoader
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++
++ if (is == null) {
++@@ -293,7 +333,7 @@
++ // ClassLoader because we want to avoid the case where the
++ // resource file was found using one ClassLoader and the
++ // provider class was instantiated using a different one.
++- return newInstance(factoryClassName, cl, false);
+++ return newInstance(factoryClassName, cl, false, useBSClsLoader);
++ }
++
++ // No provider found
++--- src/javax/xml/stream/FactoryFinder.java 2013-04-16 14:28:09.788157518 +0100
+++++ src/javax/xml/stream/FactoryFinder.java 2013-04-16 14:29:26.569394704 +0100
++@@ -25,14 +25,12 @@
++
++ package javax.xml.stream;
++
++-import java.io.InputStream;
++-import java.io.IOException;
++-import java.io.File;
++-import java.io.FileInputStream;
++-
++-import java.util.Properties;
++ import java.io.BufferedReader;
+++import java.io.File;
+++import java.io.IOException;
+++import java.io.InputStream;
++ import java.io.InputStreamReader;
+++import java.util.Properties;
++
++ /**
++ * <p>Implements pluggable Datatypes.</p>
++@@ -43,6 +41,8 @@
++ * @author Santiago.PericasGeertsen@sun.com
++ */
++ class FactoryFinder {
+++ // Check we have access to package.
+++ private static final String DEFAULT_PACKAGE = "com.sun.xml.internal.";
++
++ /**
++ * Internal debug flag.
++@@ -94,18 +94,24 @@
++ * If the class loader supplied is <code>null</code>, first try using the
++ * context class loader followed by the current (i.e. bootstrap) class
++ * loader.
+++ *
+++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true
++ */
++ static private Class getProviderClass(String className, ClassLoader cl,
++- boolean doFallback) throws ClassNotFoundException
+++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException
++ {
++ try {
++ if (cl == null) {
++- cl = ss.getContextClassLoader();
++- if (cl == null) {
++- throw new ClassNotFoundException();
++- }
++- else {
++- return cl.loadClass(className);
+++ if (useBSClsLoader) {
+++ return Class.forName(className, true, FactoryFinder.class.getClassLoader());
+++ } else {
+++ cl = ss.getContextClassLoader();
+++ if (cl == null) {
+++ throw new ClassNotFoundException();
+++ }
+++ else {
+++ return cl.loadClass(className);
+++ }
++ }
++ }
++ else {
++@@ -130,8 +136,8 @@
++ * @param className Name of the concrete class corresponding to the
++ * service provider
++ *
++- * @param cl ClassLoader to use to load the class, null means to use
++- * the bootstrap ClassLoader
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
++ *
++ * @param doFallback True if the current ClassLoader should be tried as
++ * a fallback if the class is not found using cl
++@@ -139,8 +145,38 @@
++ static Object newInstance(String className, ClassLoader cl, boolean doFallback)
++ throws ConfigurationError
++ {
+++ return newInstance(className, cl, doFallback, false);
+++ }
+++
+++ /**
+++ * Create an instance of a class. Delegates to method
+++ * <code>getProviderClass()</code> in order to load the class.
+++ *
+++ * @param className Name of the concrete class corresponding to the
+++ * service provider
+++ *
+++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code>
+++ * current <code>Thread</code>'s context classLoader is used to load the factory class.
+++ *
+++ * @param doFallback True if the current ClassLoader should be tried as
+++ * a fallback if the class is not found using cl
+++ *
+++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter
+++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader.
+++ */
+++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader)
+++ throws ConfigurationError
+++ {
+++ // make sure we have access to restricted packages
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ cl = null;
+++ useBSClsLoader = true;
+++ }
+++ }
+++
++ try {
++- Class providerClass = getProviderClass(className, cl, doFallback);
+++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader);
++ Object instance = providerClass.newInstance();
++ if (debug) { // Extra check to avoid computing cl strings
++ dPrint("created new instance of " + providerClass +
++@@ -233,11 +269,11 @@
++ if (ss.doesFileExist(f)) {
++ dPrint("Read properties file "+f);
++ cacheProps.load(ss.getFileInputStream(f));
++- }
++- }
++ }
++ }
++ }
+++ }
+++ }
++ factoryClassName = cacheProps.getProperty(factoryId);
++
++ if (factoryClassName != null) {
++@@ -276,6 +312,7 @@
++
++ // First try the Context ClassLoader
++ ClassLoader cl = ss.getContextClassLoader();
+++ boolean useBSClsLoader = false;
++ if (cl != null) {
++ is = ss.getResourceAsStream(cl, serviceId);
++
++@@ -283,11 +320,13 @@
++ if (is == null) {
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++ } else {
++ // No Context ClassLoader, try the current ClassLoader
++ cl = FactoryFinder.class.getClassLoader();
++ is = ss.getResourceAsStream(cl, serviceId);
+++ useBSClsLoader = true;
++ }
++
++ if (is == null) {
++@@ -325,7 +364,7 @@
++ // ClassLoader because we want to avoid the case where the
++ // resource file was found using one ClassLoader and the
++ // provider class was instantiated using a different one.
++- return newInstance(factoryClassName, cl, false);
+++ return newInstance(factoryClassName, cl, false, useBSClsLoader);
++ }
++
++ // No provider found
++--- src/javax/xml/validation/SchemaFactoryFinder.java 2013-04-16 14:28:09.800157711 +0100
+++++ src/javax/xml/validation/SchemaFactoryFinder.java 2013-04-16 14:29:26.569394704 +0100
++@@ -53,6 +53,7 @@
++ *<p> Take care of restrictions imposed by java security model </p>
++ */
++ private static SecuritySupport ss = new SecuritySupport();
+++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal";
++ /**
++ * <p>Cache properties for performance.</p>
++ */
++@@ -212,28 +213,6 @@
++ }
++ }
++
++- /**
++- // try to read from $java.home/lib/jaxp.properties
++- try {
++- String javah = ss.getSystemProperty( "java.home" );
++- String configFile = javah + File.separator +
++- "lib" + File.separator + "jaxp.properties";
++- File f = new File( configFile );
++- if( ss.doesFileExist(f)) {
++- sf = loadFromProperty(
++- propertyName,f.getAbsolutePath(), new FileInputStream(f));
++- if(sf!=null) return sf;
++- } else {
++- debugPrintln("Tried to read "+ f.getAbsolutePath()+", but it doesn't exist.");
++- }
++- } catch(Throwable e) {
++- if( debug ) {
++- debugPrintln("failed to read $java.home/lib/jaxp.properties");
++- e.printStackTrace();
++- }
++- }
++- */
++-
++ // try META-INF/services files
++ Iterator sitr = createServiceFileIterator();
++ while(sitr.hasNext()) {
++@@ -268,14 +247,20 @@
++ */
++ private Class createClass(String className) {
++ Class clazz;
+++ // make sure we have access to restricted packages
+++ boolean internal = false;
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ internal = true;
+++ }
+++ }
++
++- // use approprite ClassLoader
++ try {
++- if (classLoader != null) {
++- clazz = classLoader.loadClass(className);
++- } else {
++- clazz = Class.forName(className);
++- }
+++ if (classLoader != null && !internal) {
+++ clazz = classLoader.loadClass(className);
+++ } else {
+++ clazz = Class.forName(className);
+++ }
++ } catch (Throwable t) {
++ if(debug) t.printStackTrace();
++ return null;
++--- src/javax/xml/xpath/XPathFactoryFinder.java 2013-04-16 14:28:09.800157711 +0100
+++++ src/javax/xml/xpath/XPathFactoryFinder.java 2013-04-16 14:29:26.569394704 +0100
++@@ -47,6 +47,7 @@
++ * @since 1.5
++ */
++ class XPathFactoryFinder {
+++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xpath.internal";
++
++ private static SecuritySupport ss = new SecuritySupport() ;
++ /** debug support code. */
++@@ -245,18 +246,25 @@
++ */
++ private Class createClass(String className) {
++ Class clazz;
++-
++- // use approprite ClassLoader
++- try {
++- if (classLoader != null) {
++- clazz = classLoader.loadClass(className);
++- } else {
++- clazz = Class.forName(className);
++- }
++- } catch (Throwable t) {
++- if(debug) t.printStackTrace();
++- return null;
+++ // make sure we have access to restricted packages
+++ boolean internal = false;
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ internal = true;
++ }
+++ }
+++
+++ // use approprite ClassLoader
+++ try {
+++ if (classLoader != null && !internal) {
+++ clazz = classLoader.loadClass(className);
+++ } else {
+++ clazz = Class.forName(className);
+++ }
+++ } catch (Throwable t) {
+++ if(debug) t.printStackTrace();
+++ return null;
+++ }
++
++ return clazz;
++ }
++--- src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java 2013-04-16 14:28:09.808157841 +0100
+++++ src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java 2013-04-16 14:29:26.569394704 +0100
++@@ -104,6 +104,8 @@
++ */
++ private static final String FALLBACK_CLASS =
++ "com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl";
+++ private static final String DEFAULT_PACKAGE =
+++ "com.sun.org.apache.xerces.internal.dom";
++ /**
++ * Private constructor.
++ * @param srcs Vector List of DOMImplementationSources
++@@ -168,10 +170,15 @@
++ StringTokenizer st = new StringTokenizer(p);
++ while (st.hasMoreTokens()) {
++ String sourceName = st.nextToken();
++- // Use context class loader, falling back to Class.forName
++- // if and only if this fails...
+++ // make sure we have access to restricted packages
+++ boolean internal = false;
+++ if (System.getSecurityManager() != null) {
+++ if (sourceName != null && sourceName.startsWith(DEFAULT_PACKAGE)) {
+++ internal = true;
+++ }
+++ }
++ Class sourceClass = null;
++- if (classLoader != null) {
+++ if (classLoader != null && !internal) {
++ sourceClass = classLoader.loadClass(sourceName);
++ } else {
++ sourceClass = Class.forName(sourceName);
++--- src/org/xml/sax/helpers/NewInstance.java 2013-04-16 14:28:09.832158226 +0100
+++++ src/org/xml/sax/helpers/NewInstance.java 2013-04-16 14:29:26.569394704 +0100
++@@ -54,9 +54,10 @@
++ * including versions of Java 2.</p>
++ *
++ * @author Edwin Goei, David Brownell
+++ * @version 2.0.1 (sax2r2)
++ */
++ class NewInstance {
++-
+++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal";
++ /**
++ * Creates a new instance of the specified class name
++ *
++@@ -66,8 +67,16 @@
++ throws ClassNotFoundException, IllegalAccessException,
++ InstantiationException
++ {
+++ // make sure we have access to restricted packages
+++ boolean internal = false;
+++ if (System.getSecurityManager() != null) {
+++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) {
+++ internal = true;
+++ }
+++ }
+++
++ Class driverClass;
++- if (classLoader == null) {
+++ if (classLoader == null || internal) {
++ driverClass = Class.forName(className);
++ } else {
++ driverClass = classLoader.loadClass(className);
++@@ -75,29 +84,4 @@
++ return driverClass.newInstance();
++ }
++
++- /**
++- * Figure out which ClassLoader to use. For JDK 1.2 and later use
++- * the context ClassLoader.
++- */
++- static ClassLoader getClassLoader ()
++- {
++- Method m = null;
++-
++- try {
++- m = Thread.class.getMethod("getContextClassLoader", (Class[]) null);
++- } catch (NoSuchMethodException e) {
++- // Assume that we are running JDK 1.1, use the current ClassLoader
++- return NewInstance.class.getClassLoader();
++- }
++-
++- try {
++- return (ClassLoader) m.invoke(Thread.currentThread(), (Object[]) null);
++- } catch (IllegalAccessException e) {
++- // assert(false)
++- throw new UnknownError(e.getMessage());
++- } catch (InvocationTargetException e) {
++- // assert(e.getTargetException() instanceof SecurityException)
++- throw new UnknownError(e.getMessage());
++- }
++- }
++ }
++--- src/org/xml/sax/helpers/ParserAdapter.java 2013-04-16 14:28:09.836158291 +0100
+++++ src/org/xml/sax/helpers/ParserAdapter.java 2013-04-16 14:29:26.569394704 +0100
++@@ -74,13 +74,14 @@
++ *
++ * @since SAX 2.0
++ * @author David Megginson
+++ * @version 2.0.1 (sax2r2)
++ * @see org.xml.sax.helpers.XMLReaderAdapter
++ * @see org.xml.sax.XMLReader
++ * @see org.xml.sax.Parser
++ */
++ public class ParserAdapter implements XMLReader, DocumentHandler
++ {
++-
+++ private static SecuritySupport ss = new SecuritySupport();
++
++ ////////////////////////////////////////////////////////////////////
++ // Constructors.
++@@ -102,7 +103,7 @@
++ {
++ super();
++
++- String driver = System.getProperty("org.xml.sax.parser");
+++ String driver = ss.getSystemProperty("org.xml.sax.parser");
++
++ try {
++ setup(ParserFactory.makeParser());
++--- src/org/xml/sax/helpers/ParserFactory.java 2013-04-16 14:28:09.836158291 +0100
+++++ src/org/xml/sax/helpers/ParserFactory.java 2013-04-16 14:29:26.569394704 +0100
++@@ -30,12 +30,6 @@
++
++ package org.xml.sax.helpers;
++
++-import java.lang.ClassNotFoundException;
++-import java.lang.IllegalAccessException;
++-import java.lang.InstantiationException;
++-import java.lang.SecurityException;
++-import java.lang.ClassCastException;
++-
++ import org.xml.sax.Parser;
++
++
++@@ -69,9 +63,10 @@
++ * interface.
++ * @since SAX 1.0
++ * @author David Megginson
+++ * @version 2.0.1 (sax2r2)
++ */
++ public class ParserFactory {
++-
+++ private static SecuritySupport ss = new SecuritySupport();
++
++ /**
++ * Private null constructor.
++@@ -109,7 +104,7 @@
++ NullPointerException,
++ ClassCastException
++ {
++- String className = System.getProperty("org.xml.sax.parser");
+++ String className = ss.getSystemProperty("org.xml.sax.parser");
++ if (className == null) {
++ throw new NullPointerException("No value for sax.parser property");
++ } else {
++@@ -146,7 +141,7 @@
++ ClassCastException
++ {
++ return (Parser) NewInstance.newInstance (
++- NewInstance.getClassLoader (), className);
+++ ss.getContextClassLoader(), className);
++ }
++
++ }
++--- src/org/xml/sax/helpers/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100
+++++ src/org/xml/sax/helpers/SecuritySupport.java 2013-04-16 14:29:26.569394704 +0100
++@@ -0,0 +1,108 @@
+++/*
+++ * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * This code is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License version 2 only, as
+++ * published by the Free Software Foundation. Oracle designates this
+++ * particular file as subject to the "Classpath" exception as provided
+++ * by Oracle in the LICENSE file that accompanied this code.
+++ *
+++ * This code is distributed in the hope that it will be useful, but WITHOUT
+++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+++ * version 2 for more details (a copy is included in the LICENSE file that
+++ * accompanied this code).
+++ *
+++ * You should have received a copy of the GNU General Public License version
+++ * 2 along with this work; if not, write to the Free Software Foundation,
+++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+++ *
+++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+++ * or visit www.oracle.com if you need additional information or have any
+++ * questions.
+++ */
+++
+++package org.xml.sax.helpers;
+++
+++import java.io.*;
+++import java.security.*;
+++
+++/**
+++ * This class is duplicated for each JAXP subpackage so keep it in sync.
+++ * It is package private and therefore is not exposed as part of the JAXP
+++ * API.
+++ *
+++ * Security related methods that only work on J2SE 1.2 and newer.
+++ */
+++class SecuritySupport {
+++
+++
+++ ClassLoader getContextClassLoader() throws SecurityException{
+++ return (ClassLoader)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ ClassLoader cl = null;
+++ //try {
+++ cl = Thread.currentThread().getContextClassLoader();
+++ //} catch (SecurityException ex) { }
+++
+++ if (cl == null)
+++ cl = ClassLoader.getSystemClassLoader();
+++
+++ return cl;
+++ }
+++ });
+++ }
+++
+++ String getSystemProperty(final String propName) {
+++ return (String)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return System.getProperty(propName);
+++ }
+++ });
+++ }
+++
+++ FileInputStream getFileInputStream(final File file)
+++ throws FileNotFoundException
+++ {
+++ try {
+++ return (FileInputStream)
+++ AccessController.doPrivileged(new PrivilegedExceptionAction() {
+++ public Object run() throws FileNotFoundException {
+++ return new FileInputStream(file);
+++ }
+++ });
+++ } catch (PrivilegedActionException e) {
+++ throw (FileNotFoundException)e.getException();
+++ }
+++ }
+++
+++ InputStream getResourceAsStream(final ClassLoader cl,
+++ final String name)
+++ {
+++ return (InputStream)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ InputStream ris;
+++ if (cl == null) {
+++ ris = Object.class.getResourceAsStream(name);
+++ } else {
+++ ris = cl.getResourceAsStream(name);
+++ }
+++ return ris;
+++ }
+++ });
+++ }
+++
+++ boolean doesFileExist(final File f) {
+++ return ((Boolean)
+++ AccessController.doPrivileged(new PrivilegedAction() {
+++ public Object run() {
+++ return new Boolean(f.exists());
+++ }
+++ })).booleanValue();
+++ }
+++
+++}
++--- src/org/xml/sax/helpers/XMLReaderFactory.java 2013-04-16 14:28:09.836158291 +0100
+++++ src/org/xml/sax/helpers/XMLReaderFactory.java 2013-04-16 14:29:26.569394704 +0100
++@@ -34,8 +34,6 @@
++ import java.io.BufferedReader;
++ import java.io.InputStream;
++ import java.io.InputStreamReader;
++-import java.security.AccessController;
++-import java.security.PrivilegedAction;
++ import org.xml.sax.XMLReader;
++ import org.xml.sax.SAXException;
++
++@@ -85,8 +83,8 @@
++ }
++
++ private static final String property = "org.xml.sax.driver";
+++ private static SecuritySupport ss = new SecuritySupport();
++
++- private static String _clsFromJar = null;
++ private static boolean _jarread = false;
++ /**
++ * Attempt to create an XMLReader from system defaults.
++@@ -134,43 +132,45 @@
++ throws SAXException
++ {
++ String className = null;
++- ClassLoader loader = NewInstance.getClassLoader ();
+++ ClassLoader cl = ss.getContextClassLoader();
++
++ // 1. try the JVM-instance-wide system property
++- try { className = System.getProperty (property); }
++- catch (RuntimeException e) { /* normally fails for applets */ }
+++ try {
+++ className = ss.getSystemProperty(property);
+++ }
+++ catch (RuntimeException e) { /* continue searching */ }
++
++ // 2. if that fails, try META-INF/services/
++ if (className == null) {
++ if (!_jarread) {
++- final ClassLoader loader1 = loader;
++ _jarread = true;
++- _clsFromJar = (String)
++- AccessController.doPrivileged(new PrivilegedAction() {
++- public Object run() {
++- String clsName = null;
++- try {
++- String service = "META-INF/services/" + property;
++- InputStream in;
++- BufferedReader reader;
++- if (loader1 == null)
++- in = ClassLoader.getSystemResourceAsStream (service);
++- else
++- in = loader1.getResourceAsStream (service);
++-
++- if (in != null) {
++- reader = new BufferedReader (
++- new InputStreamReader (in, "UTF8"));
++- clsName = reader.readLine ();
++- in.close ();
++- }
++- } catch (Exception e) {
+++ String service = "META-INF/services/" + property;
+++ InputStream in;
+++ BufferedReader reader;
+++
+++ try {
+++ if (cl != null) {
+++ in = ss.getResourceAsStream(cl, service);
+++
+++ // If no provider found then try the current ClassLoader
+++ if (in == null) {
+++ cl = null;
+++ in = ss.getResourceAsStream(cl, service);
++ }
++- return clsName;
+++ } else {
+++ // No Context ClassLoader, try the current ClassLoader
+++ in = ss.getResourceAsStream(cl, service);
++ }
++- });
+++
+++ if (in != null) {
+++ reader = new BufferedReader (
+++ new InputStreamReader (in, "UTF8"));
+++ className = reader.readLine ();
+++ in.close ();
+++ }
+++ } catch (Exception e) {
+++ }
++ }
++- className = _clsFromJar;
++ }
++
++ // 3. Distro-specific fallback
++@@ -187,7 +187,7 @@
++
++ // do we know the XMLReader implementation class yet?
++ if (className != null)
++- return loadClass (loader, className);
+++ return loadClass (cl, className);
++
++ // 4. panic -- adapt any SAX1 parser
++ try {
++@@ -217,7 +217,7 @@
++ public static XMLReader createXMLReader (String className)
++ throws SAXException
++ {
++- return loadClass (NewInstance.getClassLoader (), className);
+++ return loadClass (ss.getContextClassLoader(), className);
++ }
++
++ private static XMLReader loadClass (ClassLoader loader, String className)
+--- jdk/src/share/lib/security/java.security 2013-04-16 14:28:12.392199476 +0100
++++ jdk/src/share/lib/security/java.security 2013-04-16 14:29:26.545394318 +0100
+@@ -130,10 +130,27 @@
+ package.access=sun.,\
+ com.sun.xml.internal.bind.,\
+ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.stream.,\
+ com.sun.xml.internal.ws.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+- com.sun.jmx.
++ com.sun.jmx.,\
++ com.sun.org.apache.bcel.internal.,\
++ com.sun.org.apache.regexp.internal.,\
++ com.sun.org.apache.xerces.internal.,\
++ com.sun.org.apache.xpath.internal.,\
++ com.sun.org.apache.xalan.internal.extensions.,\
++ com.sun.org.apache.xalan.internal.lib.,\
++ com.sun.org.apache.xalan.internal.res.,\
++ com.sun.org.apache.xalan.internal.templates.,\
++ com.sun.org.apache.xalan.internal.xslt.,\
++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
++ com.sun.org.apache.xalan.internal.xsltc.trax.,\
++ com.sun.org.apache.xalan.internal.xsltc.util.,\
++ com.sun.org.apache.xml.internal.res.,\
++ com.sun.org.apache.xml.internal.serializer.utils.,\
++ com.sun.org.apache.xml.internal.utils.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -148,10 +165,27 @@
+ package.definition=sun.,\
+ com.sun.xml.internal.bind.,\
+ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.stream.,\
+ com.sun.xml.internal.ws.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+- com.sun.jmx.
++ com.sun.jmx.,\
++ com.sun.org.apache.bcel.internal.,\
++ com.sun.org.apache.regexp.internal.,\
++ com.sun.org.apache.xerces.internal.,\
++ com.sun.org.apache.xpath.internal.,\
++ com.sun.org.apache.xalan.internal.extensions.,\
++ com.sun.org.apache.xalan.internal.lib.,\
++ com.sun.org.apache.xalan.internal.res.,\
++ com.sun.org.apache.xalan.internal.templates.,\
++ com.sun.org.apache.xalan.internal.xslt.,\
++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
++ com.sun.org.apache.xalan.internal.xsltc.trax.,\
++ com.sun.org.apache.xalan.internal.xsltc.util.,\
++ com.sun.org.apache.xml.internal.res.,\
++ com.sun.org.apache.xml.internal.serializer.utils.,\
++ com.sun.org.apache.xml.internal.utils.
+
+ #
+ # Determines whether this properties file can be appended to
+--- jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:28:12.396199540 +0100
++++ jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:30:42.026610629 +0100
+@@ -131,10 +131,27 @@
+ package.access=sun.,\
+ com.sun.xml.internal.bind.,\
+ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.stream.,\
+ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+- com.sun.jmx.
++ com.sun.jmx.,\
++ com.sun.org.apache.bcel.internal.,\
++ com.sun.org.apache.regexp.internal.,\
++ com.sun.org.apache.xerces.internal.,\
++ com.sun.org.apache.xpath.internal.,\
++ com.sun.org.apache.xalan.internal.extensions.,\
++ com.sun.org.apache.xalan.internal.lib.,\
++ com.sun.org.apache.xalan.internal.res.,\
++ com.sun.org.apache.xalan.internal.templates.,\
++ com.sun.org.apache.xalan.internal.xslt.,\
++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
++ com.sun.org.apache.xalan.internal.xsltc.trax.,\
++ com.sun.org.apache.xalan.internal.xsltc.util.,\
++ com.sun.org.apache.xml.internal.res.,\
++ com.sun.org.apache.xml.internal.serializer.utils.,\
++ com.sun.org.apache.xml.internal.utils.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -149,10 +166,27 @@
+ package.definition=sun.,\
+ com.sun.xml.internal.bind.,\
+ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.stream.,\
+ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+- com.sun.jmx.
++ com.sun.jmx.,\
++ com.sun.org.apache.bcel.internal.,\
++ com.sun.org.apache.regexp.internal.,\
++ com.sun.org.apache.xerces.internal.,\
++ com.sun.org.apache.xpath.internal.,\
++ com.sun.org.apache.xalan.internal.extensions.,\
++ com.sun.org.apache.xalan.internal.lib.,\
++ com.sun.org.apache.xalan.internal.res.,\
++ com.sun.org.apache.xalan.internal.templates.,\
++ com.sun.org.apache.xalan.internal.xslt.,\
++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
++ com.sun.org.apache.xalan.internal.xsltc.trax.,\
++ com.sun.org.apache.xalan.internal.xsltc.util.,\
++ com.sun.org.apache.xml.internal.res.,\
++ com.sun.org.apache.xml.internal.serializer.utils.,\
++ com.sun.org.apache.xml.internal.utils.
+
+ #
+ # Determines whether this properties file can be appended to
+--- jdk/src/share/lib/security/java.security-windows 2013-04-16 14:28:12.396199540 +0100
++++ jdk/src/share/lib/security/java.security-windows 2013-04-16 14:31:35.027464728 +0100
+@@ -131,10 +131,27 @@
+ package.access=sun.,\
+ com.sun.xml.internal.bind.,\
+ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.stream.,\
+ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+- com.sun.jmx.
++ com.sun.jmx.,\
++ com.sun.org.apache.bcel.internal.,\
++ com.sun.org.apache.regexp.internal.,\
++ com.sun.org.apache.xerces.internal.,\
++ com.sun.org.apache.xpath.internal.,\
++ com.sun.org.apache.xalan.internal.extensions.,\
++ com.sun.org.apache.xalan.internal.lib.,\
++ com.sun.org.apache.xalan.internal.res.,\
++ com.sun.org.apache.xalan.internal.templates.,\
++ com.sun.org.apache.xalan.internal.xslt.,\
++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
++ com.sun.org.apache.xalan.internal.xsltc.trax.,\
++ com.sun.org.apache.xalan.internal.xsltc.util.,\
++ com.sun.org.apache.xml.internal.res.,\
++ com.sun.org.apache.xml.internal.serializer.utils.,\
++ com.sun.org.apache.xml.internal.utils.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -149,10 +166,27 @@
+ package.definition=sun.,\
+ com.sun.xml.internal.bind.,\
+ com.sun.xml.internal.org.jvnet.staxex.,\
++ com.sun.xml.internal.stream.,\
+ com.sun.xml.internal.ws.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+- com.sun.jmx.
++ com.sun.jmx.,\
++ com.sun.org.apache.bcel.internal.,\
++ com.sun.org.apache.regexp.internal.,\
++ com.sun.org.apache.xerces.internal.,\
++ com.sun.org.apache.xpath.internal.,\
++ com.sun.org.apache.xalan.internal.extensions.,\
++ com.sun.org.apache.xalan.internal.lib.,\
++ com.sun.org.apache.xalan.internal.res.,\
++ com.sun.org.apache.xalan.internal.templates.,\
++ com.sun.org.apache.xalan.internal.xslt.,\
++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
++ com.sun.org.apache.xalan.internal.xsltc.trax.,\
++ com.sun.org.apache.xalan.internal.xsltc.util.,\
++ com.sun.org.apache.xml.internal.res.,\
++ com.sun.org.apache.xml.internal.serializer.utils.,\
++ com.sun.org.apache.xml.internal.utils.
+
+ #
+ # Determines whether this properties file can be appended to
diff --git a/java/openjdk6/files/icedtea/security/20130416/7200507.patch b/java/openjdk6/files/icedtea/security/20130416/7200507.patch
new file mode 100644
index 000000000000..db3c012bf638
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/7200507.patch
@@ -0,0 +1,230 @@
+# HG changeset patch
+# User malenkov
+# Date 1360332416 -14400
+# Node ID b2b6ab9d345561a349b840b4d0f18ef9bb9911e4
+# Parent 4d66f7ebcf99c1b322f47ff0aa6adadcd995f8f4
+7200507: Refactor Introspector internals
+Reviewed-by: ahgross, art
+
+diff --git a/src/share/classes/java/beans/ThreadGroupContext.java b/src/share/classes/java/beans/ThreadGroupContext.java
+--- jdk/src/share/classes/java/beans/ThreadGroupContext.java
++++ jdk/src/share/classes/java/beans/ThreadGroupContext.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -29,7 +29,6 @@
+ import com.sun.beans.finder.PropertyEditorFinder;
+
+ import java.awt.GraphicsEnvironment;
+-import java.util.HashMap;
+ import java.util.Map;
+ import java.util.WeakHashMap;
+
+@@ -42,7 +41,7 @@
+ */
+ final class ThreadGroupContext {
+
+- private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<ThreadGroup, ThreadGroupContext>();
++ private static final WeakIdentityMap<ThreadGroupContext> contexts = new WeakIdentityMap<ThreadGroupContext>();
+
+ /**
+ * Returns the appropriate {@code AppContext} for the caller,
+@@ -69,6 +68,8 @@
+ private BeanInfoFinder beanInfoFinder;
+ private PropertyEditorFinder propertyEditorFinder;
+
++ private ThreadGroupContext() {
++ }
+
+ boolean isDesignTime() {
+ return this.isDesignTime;
+diff --git a/src/share/classes/java/beans/WeakIdentityMap.java b/src/share/classes/java/beans/WeakIdentityMap.java
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/classes/java/beans/WeakIdentityMap.java
+@@ -0,0 +1,181 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package java.beans;
++
++import java.lang.ref.ReferenceQueue;
++import java.lang.ref.WeakReference;
++
++/**
++ * Hash table based mapping, which uses weak references to store keys
++ * and reference-equality in place of object-equality to compare them.
++ * An entry will automatically be removed when its key is no longer
++ * in ordinary use. Both null values and the null key are supported.
++ *
++ * @see java.util.IdentityHashMap
++ * @see java.util.WeakHashMap
++ */
++final class WeakIdentityMap<T> {
++
++ private static final int MAXIMUM_CAPACITY = 1 << 30; // it MUST be a power of two
++ private static final Object NULL = new Object(); // special object for null key
++
++ private final ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
++
++ private Entry<T>[] table = newTable(1<<3); // table's length MUST be a power of two
++ private int threshold = 6; // the next size value at which to resize
++ private int size = 0; // the number of key-value mappings
++
++ public T get(Object key) {
++ removeStaleEntries();
++ if (key == null) {
++ key = NULL;
++ }
++ int hash = key.hashCode();
++ int index = getIndex(this.table, hash);
++ for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) {
++ if (entry.isMatched(key, hash)) {
++ return entry.value;
++ }
++ }
++ return null;
++ }
++
++ public T put(Object key, T value) {
++ removeStaleEntries();
++ if (key == null) {
++ key = NULL;
++ }
++ int hash = key.hashCode();
++ int index = getIndex(this.table, hash);
++ for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) {
++ if (entry.isMatched(key, hash)) {
++ T oldValue = entry.value;
++ entry.value = value;
++ return oldValue;
++ }
++ }
++ this.table[index] = new Entry<T>(key, hash, value, this.queue, this.table[index]);
++ if (++this.size >= this.threshold) {
++ if (this.table.length == MAXIMUM_CAPACITY) {
++ this.threshold = Integer.MAX_VALUE;
++ }
++ else {
++ removeStaleEntries();
++ Entry<T>[] table = newTable(this.table.length * 2);
++ transfer(this.table, table);
++
++ // If ignoring null elements and processing ref queue caused massive
++ // shrinkage, then restore old table. This should be rare, but avoids
++ // unbounded expansion of garbage-filled tables.
++ if (this.size >= this.threshold / 2) {
++ this.table = table;
++ this.threshold *= 2;
++ }
++ else {
++ transfer(table, this.table);
++ }
++ }
++ }
++ return null;
++ }
++
++ private void removeStaleEntries() {
++ for (Object ref = this.queue.poll(); ref != null; ref = this.queue.poll()) {
++ @SuppressWarnings("unchecked")
++ Entry<T> entry = (Entry<T>) ref;
++ int index = getIndex(this.table, entry.hash);
++
++ Entry<T> prev = this.table[index];
++ Entry<T> current = prev;
++ while (current != null) {
++ Entry<T> next = current.next;
++ if (current == entry) {
++ if (prev == entry) {
++ this.table[index] = next;
++ }
++ else {
++ prev.next = next;
++ }
++ entry.value = null; // Help GC
++ entry.next = null; // Help GC
++ this.size--;
++ break;
++ }
++ prev = current;
++ current = next;
++ }
++ }
++ }
++
++ private void transfer(Entry<T>[] oldTable, Entry<T>[] newTable) {
++ for (int i = 0; i < oldTable.length; i++) {
++ Entry<T> entry = oldTable[i];
++ oldTable[i] = null;
++ while (entry != null) {
++ Entry<T> next = entry.next;
++ Object key = entry.get();
++ if (key == null) {
++ entry.value = null; // Help GC
++ entry.next = null; // Help GC
++ this.size--;
++ }
++ else {
++ int index = getIndex(newTable, entry.hash);
++ entry.next = newTable[index];
++ newTable[index] = entry;
++ }
++ entry = next;
++ }
++ }
++ }
++
++
++ @SuppressWarnings("unchecked")
++ private Entry<T>[] newTable(int length) {
++ return (Entry<T>[]) new Entry<?>[length];
++ }
++
++ private static int getIndex(Entry<?>[] table, int hash) {
++ return hash & (table.length - 1);
++ }
++
++ private static class Entry<T> extends WeakReference<Object> {
++ private final int hash;
++ private T value;
++ private Entry<T> next;
++
++ Entry(Object key, int hash, T value, ReferenceQueue<Object> queue, Entry<T> next) {
++ super(key, queue);
++ this.hash = hash;
++ this.value = value;
++ this.next = next;
++ }
++
++ boolean isMatched(Object key, int hash) {
++ return (this.hash == hash) && (key == get());
++ }
++ }
++}
diff --git a/java/openjdk6/files/icedtea/security/20130416/8000724.patch b/java/openjdk6/files/icedtea/security/20130416/8000724.patch
new file mode 100644
index 000000000000..c288d52a497c
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8000724.patch
@@ -0,0 +1,1368 @@
+# HG changeset patch
+# User andrew
+# Date 1365736051 -3600
+# Node ID a5bbb8808ac9a6a8e20c5f267044bb0cef0bbdc1
+# Parent a98937f9777091ef36ec58b79962336d2b1ae538
+8000724: Improve networking serialization
+Summary: delegate InetAddress fields to a holder object
+Reviewed-by: alanb, chegar
+
+diff --git a/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java b/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java
+--- jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java
++++ jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java
+@@ -114,7 +114,7 @@
+ * not connected already.
+ */
+ protected void disconnect() {
+- disconnect0(connectedAddress.family);
++ disconnect0(connectedAddress.holder().getFamily());
+ connected = false;
+ connectedAddress = null;
+ connectedPort = -1;
+diff --git a/src/share/classes/java/net/Inet4Address.java b/src/share/classes/java/net/Inet4Address.java
+--- jdk/src/share/classes/java/net/Inet4Address.java
++++ jdk/src/share/classes/java/net/Inet4Address.java
+@@ -102,27 +102,28 @@
+
+ Inet4Address() {
+ super();
+- hostName = null;
+- address = 0;
+- family = IPv4;
++ holder().hostName = null;
++ holder().address = 0;
++ holder().family = IPv4;
+ }
+
+ Inet4Address(String hostName, byte addr[]) {
+- this.hostName = hostName;
+- this.family = IPv4;
++ holder().hostName = hostName;
++ holder().family = IPv4;
+ if (addr != null) {
+ if (addr.length == INADDRSZ) {
+- address = addr[3] & 0xFF;
++ int address = addr[3] & 0xFF;
+ address |= ((addr[2] << 8) & 0xFF00);
+ address |= ((addr[1] << 16) & 0xFF0000);
+ address |= ((addr[0] << 24) & 0xFF000000);
++ holder().address = address;
+ }
+ }
+ }
+ Inet4Address(String hostName, int address) {
+- this.hostName = hostName;
+- this.family = IPv4;
+- this.address = address;
++ holder().hostName = hostName;
++ holder().family = IPv4;
++ holder().address = address;
+ }
+
+ /**
+@@ -136,8 +137,8 @@
+ private Object writeReplace() throws ObjectStreamException {
+ // will replace the to be serialized 'this' object
+ InetAddress inet = new InetAddress();
+- inet.hostName = this.hostName;
+- inet.address = this.address;
++ inet.holder().hostName = holder().getHostName();
++ inet.holder().address = holder().getAddress();
+
+ /**
+ * Prior to 1.4 an InetAddress was created with a family
+@@ -145,7 +146,7 @@
+ * For compatibility reasons we must therefore write the
+ * the InetAddress with this family.
+ */
+- inet.family = 2;
++ inet.holder().family = 2;
+
+ return inet;
+ }
+@@ -159,7 +160,7 @@
+ * @since JDK1.1
+ */
+ public boolean isMulticastAddress() {
+- return ((address & 0xf0000000) == 0xe0000000);
++ return ((holder().getAddress() & 0xf0000000) == 0xe0000000);
+ }
+
+ /**
+@@ -169,7 +170,7 @@
+ * @since 1.4
+ */
+ public boolean isAnyLocalAddress() {
+- return address == 0;
++ return holder().getAddress() == 0;
+ }
+
+ /**
+@@ -198,6 +199,7 @@
+ // defined in "Documenting Special Use IPv4 Address Blocks
+ // that have been Registered with IANA" by Bill Manning
+ // draft-manning-dsua-06.txt
++ int address = holder().getAddress();
+ return (((address >>> 24) & 0xFF) == 169)
+ && (((address >>> 16) & 0xFF) == 254);
+ }
+@@ -214,6 +216,7 @@
+ // 10/8 prefix
+ // 172.16/12 prefix
+ // 192.168/16 prefix
++ int address = holder().getAddress();
+ return (((address >>> 24) & 0xFF) == 10)
+ || ((((address >>> 24) & 0xFF) == 172)
+ && (((address >>> 16) & 0xF0) == 16))
+@@ -260,6 +263,7 @@
+ */
+ public boolean isMCLinkLocal() {
+ // 224.0.0/24 prefix and ttl == 1
++ int address = holder().getAddress();
+ return (((address >>> 24) & 0xFF) == 224)
+ && (((address >>> 16) & 0xFF) == 0)
+ && (((address >>> 8) & 0xFF) == 0);
+@@ -275,6 +279,7 @@
+ */
+ public boolean isMCSiteLocal() {
+ // 239.255/16 prefix or ttl < 32
++ int address = holder().getAddress();
+ return (((address >>> 24) & 0xFF) == 239)
+ && (((address >>> 16) & 0xFF) == 255);
+ }
+@@ -290,6 +295,7 @@
+ */
+ public boolean isMCOrgLocal() {
+ // 239.192 - 239.195
++ int address = holder().getAddress();
+ return (((address >>> 24) & 0xFF) == 239)
+ && (((address >>> 16) & 0xFF) >= 192)
+ && (((address >>> 16) & 0xFF) <= 195);
+@@ -303,6 +309,7 @@
+ * @return the raw IP address of this object.
+ */
+ public byte[] getAddress() {
++ int address = holder().getAddress();
+ byte[] addr = new byte[INADDRSZ];
+
+ addr[0] = (byte) ((address >>> 24) & 0xFF);
+@@ -328,7 +335,7 @@
+ * @return a hash code value for this IP address.
+ */
+ public int hashCode() {
+- return address;
++ return holder().getAddress();
+ }
+
+ /**
+@@ -349,7 +356,7 @@
+ */
+ public boolean equals(Object obj) {
+ return (obj != null) && (obj instanceof Inet4Address) &&
+- (((InetAddress)obj).address == address);
++ (((InetAddress)obj).holder().getAddress() == holder().getAddress());
+ }
+
+ // Utilities
+diff --git a/src/share/classes/java/net/Inet4AddressImpl.java b/src/share/classes/java/net/Inet4AddressImpl.java
+--- jdk/src/share/classes/java/net/Inet4AddressImpl.java
++++ jdk/src/share/classes/java/net/Inet4AddressImpl.java
+@@ -40,7 +40,7 @@
+ public synchronized InetAddress anyLocalAddress() {
+ if (anyLocalAddress == null) {
+ anyLocalAddress = new Inet4Address(); // {0x00,0x00,0x00,0x00}
+- anyLocalAddress.hostName = "0.0.0.0";
++ anyLocalAddress.holder().hostName = "0.0.0.0";
+ }
+ return anyLocalAddress;
+ }
+diff --git a/src/share/classes/java/net/Inet6Address.java b/src/share/classes/java/net/Inet6Address.java
+--- jdk/src/share/classes/java/net/Inet6Address.java
++++ jdk/src/share/classes/java/net/Inet6Address.java
+@@ -216,18 +216,18 @@
+
+ Inet6Address() {
+ super();
+- hostName = null;
++ holder().hostName = null;
+ ipaddress = new byte[INADDRSZ];
+- family = IPv6;
++ holder().family = IPv6;
+ }
+
+ /* checking of value for scope_id should be done by caller
+ * scope_id must be >= 0, or -1 to indicate not being set
+ */
+ Inet6Address(String hostName, byte addr[], int scope_id) {
+- this.hostName = hostName;
++ holder().hostName = hostName;
+ if (addr.length == INADDRSZ) { // normal IPv6 address
+- family = IPv6;
++ holder().family = IPv6;
+ ipaddress = addr.clone();
+ }
+ if (scope_id >= 0) {
+@@ -328,9 +328,9 @@
+ }
+
+ private void initif(String hostName, byte addr[],NetworkInterface nif) throws UnknownHostException {
+- this.hostName = hostName;
++ holder().hostName = hostName;
+ if (addr.length == INADDRSZ) { // normal IPv6 address
+- family = IPv6;
++ holder().family = IPv6;
+ ipaddress = addr.clone();
+ }
+ if (nif != null) {
+@@ -415,6 +415,11 @@
+ throws IOException, ClassNotFoundException {
+ scope_ifname = null;
+ scope_ifname_set = false;
++
++ if (getClass().getClassLoader() != null) {
++ throw new SecurityException ("invalid address type");
++ }
++
+ s.defaultReadObject();
+
+ if (ifname != null && !"".equals (ifname)) {
+@@ -446,7 +451,7 @@
+ ipaddress.length);
+ }
+
+- if (family != IPv6) {
++ if (holder().getFamily() != IPv6) {
+ throw new InvalidObjectException("invalid address family type");
+ }
+ }
+diff --git a/src/share/classes/java/net/Inet6AddressImpl.java b/src/share/classes/java/net/Inet6AddressImpl.java
+--- jdk/src/share/classes/java/net/Inet6AddressImpl.java
++++ jdk/src/share/classes/java/net/Inet6AddressImpl.java
+@@ -81,7 +81,7 @@
+ if (anyLocalAddress == null) {
+ if (InetAddress.preferIPv6Address) {
+ anyLocalAddress = new Inet6Address();
+- anyLocalAddress.hostName = "::";
++ anyLocalAddress.holder().hostName = "::";
+ } else {
+ anyLocalAddress = (new Inet4AddressImpl()).anyLocalAddress();
+ }
+diff --git a/src/share/classes/java/net/InetAddress.java b/src/share/classes/java/net/InetAddress.java
+--- jdk/src/share/classes/java/net/InetAddress.java
++++ jdk/src/share/classes/java/net/InetAddress.java
+@@ -34,8 +34,12 @@
+ import java.util.ArrayList;
+ import java.security.AccessController;
+ import java.io.ObjectStreamException;
++import java.io.ObjectStreamField;
+ import java.io.IOException;
+ import java.io.ObjectInputStream;
++import java.io.ObjectInputStream.GetField;
++import java.io.ObjectOutputStream;
++import java.io.ObjectOutputStream.PutField;
+ import sun.security.action.*;
+ import sun.net.InetAddressCachePolicy;
+ import sun.net.util.IPAddressUtil;
+@@ -196,25 +200,47 @@
+ /* Specify address family preference */
+ static transient boolean preferIPv6Address = false;
+
+- /**
+- * @serial
+- */
+- String hostName;
++ static class InetAddressHolder {
+
+- /**
+- * Holds a 32-bit IPv4 address.
+- *
+- * @serial
+- */
+- int address;
++ InetAddressHolder() {}
+
+- /**
+- * Specifies the address family type, for instance, '1' for IPv4
+- * addresses, and '2' for IPv6 addresses.
+- *
+- * @serial
+- */
+- int family;
++ InetAddressHolder(String hostName, int address, int family) {
++ this.hostName = hostName;
++ this.address = address;
++ this.family = family;
++ }
++
++ String hostName;
++
++ String getHostName() {
++ return hostName;
++ }
++
++ /**
++ * Holds a 32-bit IPv4 address.
++ */
++ int address;
++
++ int getAddress() {
++ return address;
++ }
++
++ /**
++ * Specifies the address family type, for instance, '1' for IPv4
++ * addresses, and '2' for IPv6 addresses.
++ */
++ int family;
++
++ int getFamily() {
++ return family;
++ }
++ }
++
++ final transient InetAddressHolder holder;
++
++ InetAddressHolder holder() {
++ return holder;
++ }
+
+ /* Used to store the name service provider */
+ private static List<NameService> nameServices = null;
+@@ -242,6 +268,7 @@
+ * put in the address cache, since it is not created by name.
+ */
+ InetAddress() {
++ holder = new InetAddressHolder();
+ }
+
+ /**
+@@ -254,7 +281,7 @@
+ */
+ private Object readResolve() throws ObjectStreamException {
+ // will replace the deserialized 'this' object
+- return new Inet4Address(this.hostName, this.address);
++ return new Inet4Address(holder().getHostName(), holder().getAddress());
+ }
+
+ /**
+@@ -491,10 +518,10 @@
+ * @see SecurityManager#checkConnect
+ */
+ String getHostName(boolean check) {
+- if (hostName == null) {
+- hostName = InetAddress.getHostFromNameService(this, check);
++ if (holder().getHostName() == null) {
++ holder().hostName = InetAddress.getHostFromNameService(this, check);
+ }
+- return hostName;
++ return holder().getHostName();
+ }
+
+ /**
+@@ -657,6 +684,7 @@
+ * @return a string representation of this IP address.
+ */
+ public String toString() {
++ String hostName = holder().getHostName();
+ return ((hostName != null) ? hostName : "")
+ + "/" + getHostAddress();
+ }
+@@ -1500,14 +1528,58 @@
+ }
+ }
+
++ private static final long FIELDS_OFFSET;
++ private static final sun.misc.Unsafe UNSAFE;
++
++ static {
++ try {
++ sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe();
++ FIELDS_OFFSET = unsafe.objectFieldOffset(
++ InetAddress.class.getDeclaredField("holder")
++ );
++ UNSAFE = unsafe;
++ } catch (NoSuchFieldException e) {
++ throw new Error(e);
++ }
++ }
++
+ private void readObject (ObjectInputStream s) throws
+ IOException, ClassNotFoundException {
+- s.defaultReadObject ();
+ if (getClass().getClassLoader() != null) {
+- hostName = null;
+- address = 0;
+ throw new SecurityException ("invalid address type");
+ }
++ GetField gf = s.readFields();
++ String host = (String)gf.get("hostName", null);
++ int address= gf.get("address", 0);
++ int family= gf.get("family", 0);
++ InetAddressHolder h = new InetAddressHolder(host, address, family);
++ UNSAFE.putObject(this, FIELDS_OFFSET, h);
++ }
++
++ /* needed because the serializable fields no longer exist */
++
++ /**
++ * @serialField hostName String
++ * @serialField address int
++ * @serialField family int
++ */
++ private static final ObjectStreamField[] serialPersistentFields = {
++ new ObjectStreamField("hostName", String.class),
++ new ObjectStreamField("address", int.class),
++ new ObjectStreamField("family", int.class),
++ };
++
++ private void writeObject (ObjectOutputStream s) throws
++ IOException {
++ if (getClass().getClassLoader() != null) {
++ throw new SecurityException ("invalid address type");
++ }
++ PutField pf = s.putFields();
++ pf.put("hostName", holder().hostName);
++ pf.put("address", holder().address);
++ pf.put("family", holder().family);
++ s.writeFields();
++ s.flush();
+ }
+ }
+
+diff --git a/src/share/classes/java/net/InetSocketAddress.java b/src/share/classes/java/net/InetSocketAddress.java
+--- jdk/src/share/classes/java/net/InetSocketAddress.java
++++ jdk/src/share/classes/java/net/InetSocketAddress.java
+@@ -87,8 +87,8 @@
+ if (hostname != null)
+ return hostname;
+ if (addr != null) {
+- if (addr.hostName != null)
+- return addr.hostName;
++ if (addr.holder().getHostName() != null)
++ return addr.holder().getHostName();
+ else
+ return addr.getHostAddress();
+ }
+diff --git a/src/share/native/java/net/InetAddress.c b/src/share/native/java/net/InetAddress.c
+--- jdk/src/share/native/java/net/InetAddress.c
++++ jdk/src/share/native/java/net/InetAddress.c
+@@ -33,8 +33,11 @@
+ */
+
+ jclass ia_class;
+-jfieldID ia_addressID;
+-jfieldID ia_familyID;
++jclass iac_class;
++jfieldID ia_holderID;
++jfieldID iac_addressID;
++jfieldID iac_familyID;
++jfieldID iac_hostNameID;
+ jfieldID ia_preferIPv6AddressID;
+
+ /*
+@@ -48,10 +51,18 @@
+ CHECK_NULL(c);
+ ia_class = (*env)->NewGlobalRef(env, c);
+ CHECK_NULL(ia_class);
+- ia_addressID = (*env)->GetFieldID(env, ia_class, "address", "I");
+- CHECK_NULL(ia_addressID);
+- ia_familyID = (*env)->GetFieldID(env, ia_class, "family", "I");
+- CHECK_NULL(ia_familyID);
++ c = (*env)->FindClass(env,"java/net/InetAddress$InetAddressHolder");
++ CHECK_NULL(c);
++ iac_class = (*env)->NewGlobalRef(env, c);
++ ia_holderID = (*env)->GetFieldID(env, ia_class, "holder", "Ljava/net/InetAddress$InetAddressHolder;");
++ CHECK_NULL(ia_holderID);
+ ia_preferIPv6AddressID = (*env)->GetStaticFieldID(env, ia_class, "preferIPv6Address", "Z");
+ CHECK_NULL(ia_preferIPv6AddressID);
++
++ iac_addressID = (*env)->GetFieldID(env, iac_class, "address", "I");
++ CHECK_NULL(iac_addressID);
++ iac_familyID = (*env)->GetFieldID(env, iac_class, "family", "I");
++ CHECK_NULL(iac_familyID);
++ iac_hostNameID = (*env)->GetFieldID(env, iac_class, "hostName", "Ljava/lang/String;");
++ CHECK_NULL(iac_hostNameID);
+ }
+diff --git a/src/share/native/java/net/net_util.c b/src/share/native/java/net/net_util.c
+--- jdk/src/share/native/java/net/net_util.c
++++ jdk/src/share/native/java/net/net_util.c
+@@ -84,6 +84,58 @@
+ }
+ }
+
++/* The address, and family fields used to be in InetAddress
++ * but are now in an implementation object. So, there is an extra
++ * level of indirection to access them now.
++ */
++
++extern jclass iac_class;
++extern jfieldID ia_holderID;
++extern jfieldID iac_addressID;
++extern jfieldID iac_familyID;
++
++void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address) {
++ jobject holder;
++ init(env);
++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
++ (*env)->SetIntField(env, holder, iac_addressID, address);
++}
++
++void setInetAddress_family(JNIEnv *env, jobject iaObj, int family) {
++ jobject holder;
++ init(env);
++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
++ (*env)->SetIntField(env, holder, iac_familyID, family);
++}
++
++void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) {
++ jobject holder;
++ init(env);
++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
++ (*env)->SetObjectField(env, holder, iac_hostNameID, host);
++}
++
++int getInetAddress_addr(JNIEnv *env, jobject iaObj) {
++ jobject holder;
++ init(env);
++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
++ return (*env)->GetIntField(env, holder, iac_addressID);
++}
++
++int getInetAddress_family(JNIEnv *env, jobject iaObj) {
++ jobject holder;
++ init(env);
++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
++ return (*env)->GetIntField(env, holder, iac_familyID);
++}
++
++jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj) {
++ jobject holder;
++ init(env);
++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
++ return (*env)->GetObjectField(env, holder, iac_hostNameID);
++}
++
+ jobject
+ NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
+ jobject iaObj;
+@@ -110,8 +162,8 @@
+ iaObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID);
+ CHECK_NULL_RETURN(iaObj, NULL);
+ address = NET_IPv4MappedToIPv4(caddr);
+- (*env)->SetIntField(env, iaObj, ia_addressID, address);
+- (*env)->SetIntField(env, iaObj, ia_familyID, IPv4);
++ setInetAddress_addr(env, iaObj, address);
++ setInetAddress_family(env, iaObj, IPv4);
+ } else {
+ static jclass inet6Cls = 0;
+ if (inet6Cls == 0) {
+@@ -130,7 +182,7 @@
+
+ (*env)->SetObjectField(env, iaObj, ia6_ipaddressID, ipaddress);
+
+- (*env)->SetIntField(env, iaObj, ia_familyID, IPv6);
++ setInetAddress_family(env, iaObj, IPv6);
+ (*env)->SetIntField(env, iaObj, ia6_scopeidID, getScopeID(him));
+ }
+ *port = ntohs(him6->sin6_port);
+@@ -149,9 +201,8 @@
+ }
+ iaObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID);
+ CHECK_NULL_RETURN(iaObj, NULL);
+- (*env)->SetIntField(env, iaObj, ia_familyID, IPv4);
+- (*env)->SetIntField(env, iaObj, ia_addressID,
+- ntohl(him4->sin_addr.s_addr));
++ setInetAddress_family(env, iaObj, IPv4);
++ setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr));
+ *port = ntohs(him4->sin_port);
+ }
+ return iaObj;
+@@ -160,8 +211,7 @@
+ jint
+ NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
+ {
+- jint family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4?
+- AF_INET : AF_INET6;
++ jint family = getInetAddress_family(env, iaObj) == IPv4?AF_INET : AF_INET6;
+
+ #ifdef AF_INET6
+ if (him->sa_family == AF_INET6) {
+@@ -178,7 +228,7 @@
+ return JNI_FALSE;
+ }
+ addrNew = NET_IPv4MappedToIPv4(caddrNew);
+- addrCur = (*env)->GetIntField(env, iaObj, ia_addressID);
++ addrCur = getInetAddress_addr(env, iaObj);
+ if (addrNew == addrCur) {
+ return JNI_TRUE;
+ } else {
+@@ -210,7 +260,7 @@
+ return JNI_FALSE;
+ }
+ addrNew = ntohl(him4->sin_addr.s_addr);
+- addrCur = (*env)->GetIntField(env, iaObj, ia_addressID);
++ addrCur = getInetAddress_addr(env, iaObj);
+ if (addrNew == addrCur) {
+ return JNI_TRUE;
+ } else {
+diff --git a/src/share/native/java/net/net_util.h b/src/share/native/java/net/net_util.h
+--- jdk/src/share/native/java/net/net_util.h
++++ jdk/src/share/native/java/net/net_util.h
+@@ -53,10 +53,18 @@
+ * i.e. psi_timeoutID is PlainSocketImpl's timeout field's ID.
+ */
+ extern jclass ia_class;
+-extern jfieldID ia_addressID;
+-extern jfieldID ia_familyID;
++extern jfieldID iac_addressID;
++extern jfieldID iac_familyID;
++extern jfieldID iac_hostNameID;
+ extern jfieldID ia_preferIPv6AddressID;
+
++extern void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address);
++extern void setInetAddress_family(JNIEnv *env, jobject iaObj, int family);
++extern void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject h);
++extern int getInetAddress_addr(JNIEnv *env, jobject iaObj);
++extern int getInetAddress_family(JNIEnv *env, jobject iaObj);
++extern jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj);
++
+ extern jclass ia4_class;
+ extern jmethodID ia4_ctrID;
+
+diff --git a/src/solaris/native/java/net/Inet4AddressImpl.c b/src/solaris/native/java/net/Inet4AddressImpl.c
+--- jdk/src/solaris/native/java/net/Inet4AddressImpl.c
++++ jdk/src/solaris/native/java/net/Inet4AddressImpl.c
+@@ -118,9 +118,6 @@
+ static jclass ni_iacls;
+ static jclass ni_ia4cls;
+ static jmethodID ni_ia4ctrID;
+-static jfieldID ni_iaaddressID;
+-static jfieldID ni_iahostID;
+-static jfieldID ni_iafamilyID;
+ static int initialized = 0;
+
+ /*
+@@ -153,9 +150,6 @@
+ ni_ia4cls = (*env)->FindClass(env, "java/net/Inet4Address");
+ ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls);
+ ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
+- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I");
+- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;");
+ initialized = 1;
+ }
+
+@@ -229,9 +223,8 @@
+ ret = NULL;
+ goto cleanupAndReturn;
+ }
+- (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+- ntohl((*addrp)->s_addr));
+- (*env)->SetObjectField(env, iaObj, ni_iahostID, name);
++ setInetAddress_addr(env, iaObj, ntohl((*addrp)->s_addr));
++ setInetAddress_hostName(env, iaObj, name);
+ (*env)->SetObjectArrayElement(env, ret, i, iaObj);
+ addrp++;
+ i++;
+diff --git a/src/solaris/native/java/net/Inet6AddressImpl.c b/src/solaris/native/java/net/Inet6AddressImpl.c
+--- jdk/src/solaris/native/java/net/Inet6AddressImpl.c
++++ jdk/src/solaris/native/java/net/Inet6AddressImpl.c
+@@ -120,9 +120,6 @@
+ static jclass ni_ia6cls;
+ static jmethodID ni_ia4ctrID;
+ static jmethodID ni_ia6ctrID;
+-static jfieldID ni_iaaddressID;
+-static jfieldID ni_iahostID;
+-static jfieldID ni_iafamilyID;
+ static jfieldID ni_ia6ipaddressID;
+ static int initialized = 0;
+
+@@ -161,9 +158,6 @@
+ ni_ia6cls = (*env)->NewGlobalRef(env, ni_ia6cls);
+ ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
+ ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V");
+- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I");
+- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;");
+ ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B");
+ initialized = 1;
+ }
+@@ -322,9 +316,8 @@
+ ret = NULL;
+ goto cleanupAndReturn;
+ }
+- (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+- ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
+- (*env)->SetObjectField(env, iaObj, ni_iahostID, name);
++ setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
++ setInetAddress_hostName(env, iaObj, name);
+ (*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj);
+ inetIndex++;
+ } else if (iterator->ai_family == AF_INET6) {
+@@ -355,7 +348,7 @@
+ (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
+ }
+ (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress);
+- (*env)->SetObjectField(env, iaObj, ni_iahostID, name);
++ setInetAddress_hostName(env, iaObj, name);
+ (*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj);
+ inet6Index++;
+ }
+diff --git a/src/solaris/native/java/net/NetworkInterface.c b/src/solaris/native/java/net/NetworkInterface.c
+--- jdk/src/solaris/native/java/net/NetworkInterface.c
++++ jdk/src/solaris/native/java/net/NetworkInterface.c
+@@ -101,8 +101,6 @@
+ static jmethodID ni_ia4ctrID;
+ static jmethodID ni_ia6ctrID;
+ static jmethodID ni_ibctrID;
+-static jfieldID ni_iaaddressID;
+-static jfieldID ni_iafamilyID;
+ static jfieldID ni_ia6ipaddressID;
+ static jfieldID ni_ibaddressID;
+ static jfieldID ni_ib4broadcastID;
+@@ -153,8 +151,6 @@
+ ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
+ ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V");
+ ni_ibctrID = (*env)->GetMethodID(env, ni_ibcls, "<init>", "()V");
+- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I");
+ ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B");
+ ni_ibaddressID = (*env)->GetFieldID(env, ni_ibcls, "address", "Ljava/net/InetAddress;");
+ ni_ib4broadcastID = (*env)->GetFieldID(env, ni_ibcls, "broadcast", "Ljava/net/Inet4Address;");
+@@ -253,8 +249,7 @@
+ (JNIEnv *env, jclass cls, jobject iaObj) {
+
+ netif *ifs, *curr;
+- int family = (*env)->GetIntField(env, iaObj, ni_iafamilyID) == IPv4?
+- AF_INET : AF_INET6;
++ int family = (getInetAddress_family(env, iaObj) == IPv4) ? AF_INET : AF_INET6;
+ jobject obj = NULL;
+ jboolean match = JNI_FALSE;
+
+@@ -275,7 +270,7 @@
+ if (family == addrP->family) {
+ if (family == AF_INET) {
+ int address1 = htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr);
+- int address2 = (*env)->GetIntField(env, iaObj, ni_iaaddressID);
++ int address2 = getInetAddress_addr(env, iaObj);
+
+ if (address1 == address2) {
+ match = JNI_TRUE;
+@@ -450,8 +445,7 @@
+ if (addrP->family == AF_INET) {
+ iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
+ if (iaObj) {
+- (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+- htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr));
++ setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr));
+ }
+ ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
+ if (ibObj) {
+@@ -460,8 +454,7 @@
+ jobject ia2Obj = NULL;
+ ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
+ if (ia2Obj) {
+- (*env)->SetIntField(env, ia2Obj, ni_iaaddressID,
+- htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
++ setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
+ (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
+ (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
+ }
+diff --git a/src/solaris/native/java/net/PlainDatagramSocketImpl.c b/src/solaris/native/java/net/PlainDatagramSocketImpl.c
+--- jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c
++++ jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c
+@@ -610,11 +610,10 @@
+ }
+
+ iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&remote_addr, &port);
+- family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4?
+- AF_INET : AF_INET6;
++ family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;
+ if (family == AF_INET) { /* this api can't handle IPV6 addresses */
+- int address = (*env)->GetIntField(env, iaObj, ia_addressID);
+- (*env)->SetIntField(env, addressObj, ia_addressID, address);
++ int address = getInetAddress_addr(env, iaObj);
++ setInetAddress_addr(env, addressObj, address);
+ }
+ return port;
+ }
+@@ -1142,7 +1141,6 @@
+ */
+ static void mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jobject value) {
+ static jfieldID ni_addrsID;
+- static jfieldID ia_addressID;
+ struct in_addr in;
+ jobjectArray addrArray;
+ jsize len;
+@@ -1155,10 +1153,6 @@
+ ni_addrsID = (*env)->GetFieldID(env, c, "addrs",
+ "[Ljava/net/InetAddress;");
+ CHECK_NULL(ni_addrsID);
+- c = (*env)->FindClass(env,"java/net/InetAddress");
+- CHECK_NULL(c);
+- ia_addressID = (*env)->GetFieldID(env, c, "address", "I");
+- CHECK_NULL(ia_addressID);
+ }
+
+ addrArray = (*env)->GetObjectField(env, value, ni_addrsID);
+@@ -1179,8 +1173,8 @@
+ */
+ for (i = 0; i < len; i++) {
+ addr = (*env)->GetObjectArrayElement(env, addrArray, i);
+- if ((*env)->GetIntField(env, addr, ia_familyID) == IPv4) {
+- in.s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID));
++ if (getInetAddress_family(env, addr) == IPv4) {
++ in.s_addr = htonl(getInetAddress_addr(env, addr));
+ break;
+ }
+ }
+@@ -1238,17 +1232,9 @@
+ * Throw exception if failed.
+ */
+ static void mcast_set_if_by_addr_v4(JNIEnv *env, jobject this, int fd, jobject value) {
+- static jfieldID ia_addressID;
+ struct in_addr in;
+
+- if (ia_addressID == NULL) {
+- jclass c = (*env)->FindClass(env,"java/net/InetAddress");
+- CHECK_NULL(c);
+- ia_addressID = (*env)->GetFieldID(env, c, "address", "I");
+- CHECK_NULL(ia_addressID);
+- }
+-
+- in.s_addr = htonl( (*env)->GetIntField(env, value, ia_addressID) );
++ in.s_addr = htonl( getInetAddress_addr(env, value) );
+
+ if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
+ (const char*)&in, sizeof(in)) < 0) {
+@@ -1583,7 +1569,6 @@
+ if (isIPV4) {
+ static jclass inet4_class;
+ static jmethodID inet4_ctrID;
+- static jfieldID inet4_addrID;
+
+ static jclass ni_class;
+ static jmethodID ni_ctrID;
+@@ -1621,8 +1606,6 @@
+ CHECK_NULL_RETURN(c, NULL);
+ inet4_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V");
+ CHECK_NULL_RETURN(inet4_ctrID, NULL);
+- inet4_addrID = (*env)->GetFieldID(env, c, "address", "I");
+- CHECK_NULL_RETURN(inet4_addrID, NULL);
+ inet4_class = (*env)->NewGlobalRef(env, c);
+ CHECK_NULL_RETURN(inet4_class, NULL);
+ }
+@@ -1630,10 +1613,10 @@
+ CHECK_NULL_RETURN(addr, NULL);
+
+ #ifdef __linux__
+- (*env)->SetIntField(env, addr, inet4_addrID,
+- (isOldKernel ? ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr)) );
++ setInetAddress_addr(env, addr, (isOldKernel ?
++ ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr)));
+ #else
+- (*env)->SetIntField(env, addr, inet4_addrID, ntohl(in.s_addr));
++ setInetAddress_addr(env, addr, ntohl(in.s_addr));
+ #endif
+
+ /*
+@@ -2112,7 +2095,7 @@
+ ipv6_join_leave = ipv6_available();
+
+ #ifdef __linux__
+- if ((*env)->GetIntField(env, iaObj, ia_familyID) == IPv4) {
++ if (getInetAddress_family(env, iaObj) == IPv4) {
+ ipv6_join_leave = JNI_FALSE;
+ }
+ #endif
+@@ -2159,7 +2142,7 @@
+ CHECK_NULL(ni_indexID);
+ }
+
+- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID));
++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ mname.imr_address.s_addr = 0;
+ mname.imr_ifindex = (*env)->GetIntField(env, niObj, ni_indexID);
+ mname_len = sizeof(struct ip_mreqn);
+@@ -2177,11 +2160,11 @@
+ }
+ addr = (*env)->GetObjectArrayElement(env, addrArray, 0);
+
+- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID));
++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ #ifdef __linux__
+- mname.imr_address.s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID));
++ mname.imr_address.s_addr = htonl(getInetAddress_addr(env, addr));
+ #else
+- mname.imr_interface.s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID));
++ mname.imr_interface.s_addr = htonl(getInetAddress_addr(env, addr));
+ #endif
+ mname_len = sizeof(struct ip_mreq);
+ }
+@@ -2220,7 +2203,7 @@
+ }
+ }
+
+- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID));
++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ mname.imr_address.s_addr = 0 ;
+ mname.imr_ifindex = index;
+ mname_len = sizeof(struct ip_mreqn);
+@@ -2250,7 +2233,7 @@
+ #else
+ mname.imr_interface.s_addr = in.s_addr;
+ #endif
+- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID));
++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ mname_len = sizeof(struct ip_mreq);
+ }
+ }
+@@ -2315,10 +2298,10 @@
+ jbyte caddr[16];
+ jint family;
+ jint address;
+- family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4? AF_INET : AF_INET6;
++ family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;
+ if (family == AF_INET) { /* will convert to IPv4-mapped address */
+ memset((char *) caddr, 0, 16);
+- address = (*env)->GetIntField(env, iaObj, ia_addressID);
++ address = getInetAddress_addr(env, iaObj);
+
+ caddr[10] = 0xff;
+ caddr[11] = 0xff;
+diff --git a/src/solaris/native/java/net/net_util_md.c b/src/solaris/native/java/net/net_util_md.c
+--- jdk/src/solaris/native/java/net/net_util_md.c
++++ jdk/src/solaris/native/java/net/net_util_md.c
+@@ -675,7 +675,7 @@
+ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him,
+ int *len, jboolean v4MappedAddress) {
+ jint family;
+- family = (*env)->GetIntField(env, iaObj, ia_familyID);
++ family = getInetAddress_family(env, iaObj);
+ #ifdef AF_INET6
+ /* needs work. 1. family 2. clean up him6 etc deallocate memory */
+ if (ipv6_available() && !(family == IPv4 && v4MappedAddress == JNI_FALSE)) {
+@@ -687,7 +687,7 @@
+
+ if (family == IPv4) { /* will convert to IPv4-mapped address */
+ memset((char *) caddr, 0, 16);
+- address = (*env)->GetIntField(env, iaObj, ia_addressID);
++ address = getInetAddress_addr(env, iaObj);
+ if (address == INADDR_ANY) {
+ /* we would always prefer IPv6 wildcard address
+ caddr[10] = 0xff;
+@@ -794,7 +794,7 @@
+ return -1;
+ }
+ memset((char *) him4, 0, sizeof(struct sockaddr_in));
+- address = (*env)->GetIntField(env, iaObj, ia_addressID);
++ address = getInetAddress_addr(env, iaObj);
+ him4->sin_port = htons((short) port);
+ him4->sin_addr.s_addr = (uint32_t) htonl(address);
+ him4->sin_family = AF_INET;
+diff --git a/src/windows/native/java/net/Inet4AddressImpl.c b/src/windows/native/java/net/Inet4AddressImpl.c
+--- jdk/src/windows/native/java/net/Inet4AddressImpl.c
++++ jdk/src/windows/native/java/net/Inet4AddressImpl.c
+@@ -113,9 +113,6 @@
+ static jclass ni_iacls;
+ static jclass ni_ia4cls;
+ static jmethodID ni_ia4ctrID;
+-static jfieldID ni_iaaddressID;
+-static jfieldID ni_iahostID;
+-static jfieldID ni_iafamilyID;
+ static int initialized = 0;
+
+ /*
+@@ -150,9 +147,6 @@
+ ni_ia4cls = (*env)->FindClass(env, "java/net/Inet4Address");
+ ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls);
+ ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
+- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I");
+- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;");
+ initialized = 1;
+ }
+
+@@ -209,8 +203,7 @@
+ ret = NULL;
+ goto cleanupAndReturn;
+ }
+- (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+- ntohl(address));
++ setInetAddress_addr(env, iaObj, ntohl(address));
+ (*env)->SetObjectArrayElement(env, ret, 0, iaObj);
+ JNU_ReleaseStringPlatformChars(env, host, hostname);
+ return ret;
+@@ -247,9 +240,8 @@
+ ret = NULL;
+ goto cleanupAndReturn;
+ }
+- (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+- ntohl((*addrp)->s_addr));
+- (*env)->SetObjectField(env, iaObj, ni_iahostID, name);
++ setInetAddress_addr(env, iaObj, ntohl((*addrp)->s_addr));
++ setInetAddress_hostName(env, iaObj, name);
+ (*env)->SetObjectArrayElement(env, ret, i, iaObj);
+ addrp++;
+ i++;
+diff --git a/src/windows/native/java/net/Inet6AddressImpl.c b/src/windows/native/java/net/Inet6AddressImpl.c
+--- jdk/src/windows/native/java/net/Inet6AddressImpl.c
++++ jdk/src/windows/native/java/net/Inet6AddressImpl.c
+@@ -76,9 +76,6 @@
+ static jclass ni_ia6cls;
+ static jmethodID ni_ia4ctrID;
+ static jmethodID ni_ia6ctrID;
+-static jfieldID ni_iaaddressID;
+-static jfieldID ni_iahostID;
+-static jfieldID ni_iafamilyID;
+ static jfieldID ni_ia6ipaddressID;
+ static int initialized = 0;
+
+@@ -103,9 +100,6 @@
+ ni_ia6cls = (*env)->NewGlobalRef(env, ni_ia6cls);
+ ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
+ ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V");
+- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I");
+- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;");
+ ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B");
+ initialized = 1;
+ }
+@@ -250,9 +244,8 @@
+ ret = NULL;
+ goto cleanupAndReturn;
+ }
+- (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+- ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
+- (*env)->SetObjectField(env, iaObj, ni_iahostID, name);
++ setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
++ setInetAddress_hostName(env, iaObj, name);
+ (*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj);
+ inetIndex ++;
+ } else if (iterator->ai_family == AF_INET6) {
+@@ -276,7 +269,7 @@
+ (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
+ }
+ (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress);
+- (*env)->SetObjectField(env, iaObj, ni_iahostID, name);
++ setInetAddress_hostName(env, iaObj, name);
+ (*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj);
+ inet6Index ++;
+ }
+diff --git a/src/windows/native/java/net/NetworkInterface.c b/src/windows/native/java/net/NetworkInterface.c
+--- jdk/src/windows/native/java/net/NetworkInterface.c
++++ jdk/src/windows/native/java/net/NetworkInterface.c
+@@ -97,7 +97,6 @@
+ jfieldID ni_displayNameID; /* NetworkInterface.displayName */
+ jfieldID ni_childsID; /* NetworkInterface.childs */
+ jclass ni_iacls; /* InetAddress */
+-jfieldID ni_iaAddr; /* InetAddress.address */
+
+ jclass ni_ia4cls; /* Inet4Address */
+ jmethodID ni_ia4Ctor; /* Inet4Address() */
+@@ -558,7 +557,6 @@
+
+ ni_iacls = (*env)->FindClass(env, "Ljava/net/InetAddress;");
+ ni_iacls = (*env)->NewGlobalRef(env, ni_iacls);
+- ni_iaAddr = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+
+ ni_ia4cls = (*env)->FindClass(env, "Ljava/net/Inet4Address;");
+ ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls);
+@@ -645,7 +643,7 @@
+ }
+ /* default ctor will set family to AF_INET */
+
+- (*env)->SetIntField(env, iaObj, ni_iaAddr, ntohl(addrs->addr.him4.sin_addr.s_addr));
++ setInetAddress_addr(env, iaObj, ntohl(addrs->addr.him4.sin_addr.s_addr));
+ if (addrs->mask != -1) {
+ ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
+ if (ibObj == NULL) {
+@@ -658,8 +656,7 @@
+ free_netaddr(netaddrP);
+ return NULL;
+ }
+- (*env)->SetIntField(env, ia2Obj, ni_iaAddr,
+- ntohl(addrs->brdcast.him4.sin_addr.s_addr));
++ setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.him4.sin_addr.s_addr));
+ (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
+ (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
+ (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
+@@ -811,7 +808,7 @@
+ (JNIEnv *env, jclass cls, jobject iaObj)
+ {
+ netif *ifList, *curr;
+- jint addr = (*env)->GetIntField(env, iaObj, ni_iaAddr);
++ jint addr = getInetAddress_addr(env, iaObj);
+ jobject netifObj = NULL;
+
+ if (os_supports_ipv6 && ipv6_available()) {
+diff --git a/src/windows/native/java/net/NetworkInterface.h b/src/windows/native/java/net/NetworkInterface.h
+--- jdk/src/windows/native/java/net/NetworkInterface.h
++++ jdk/src/windows/native/java/net/NetworkInterface.h
+@@ -70,7 +70,6 @@
+ extern jfieldID ni_childsID; /* NetworkInterface.childs */
+
+ extern jclass ni_iacls; /* InetAddress */
+-extern jfieldID ni_iaAddr; /* InetAddress.address */
+
+ extern jclass ni_ia4cls; /* Inet4Address */
+ extern jmethodID ni_ia4Ctor; /* Inet4Address() */
+diff --git a/src/windows/native/java/net/NetworkInterface_winXP.c b/src/windows/native/java/net/NetworkInterface_winXP.c
+--- jdk/src/windows/native/java/net/NetworkInterface_winXP.c
++++ jdk/src/windows/native/java/net/NetworkInterface_winXP.c
+@@ -33,6 +33,7 @@
+ #include "jni_util.h"
+
+ #include "NetworkInterface.h"
++#include "net_util.h"
+
+ /*
+ * Windows implementation of the java.net.NetworkInterface native methods.
+@@ -468,7 +469,7 @@
+ }
+ /* default ctor will set family to AF_INET */
+
+- (*env)->SetIntField(env, iaObj, ni_iaAddr, ntohl(addrs->addr.him4.sin_addr.s_addr));
++ setInetAddress_addr(env, iaObj, ntohl(addrs->addr.him4.sin_addr.s_addr));
+
+ ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
+ if (ibObj == NULL) {
+@@ -481,8 +482,7 @@
+ free_netaddr(netaddrP);
+ return NULL;
+ }
+- (*env)->SetIntField(env, ia2Obj, ni_iaAddr,
+- ntohl(addrs->brdcast.him4.sin_addr.s_addr));
++ setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.him4.sin_addr.s_addr));
+ (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
+ (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
+ (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
+diff --git a/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c b/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
+--- jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
++++ jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
+@@ -432,7 +432,7 @@
+ int lcladdrlen;
+ int address;
+
+- family = (*env)->GetIntField(env, addressObj, ia_familyID);
++ family = getInetAddress_family(env, addressObj);
+ if (family == IPv6 && !ipv6_supported) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Protocol family not supported");
+@@ -452,7 +452,7 @@
+ JNU_ThrowNullPointerException(env, "argument address");
+ return;
+ } else {
+- address = (*env)->GetIntField(env, addressObj, ia_addressID);
++ address = getInetAddress_addr(env, addressObj);
+ }
+
+ if (NET_InetAddressToSockaddr(env, addressObj, port, (struct sockaddr *)&lcladdr, &lcladdrlen, JNI_FALSE) != 0) {
+@@ -552,9 +552,9 @@
+ return;
+ }
+
+- addr = (*env)->GetIntField(env, address, ia_addressID);
++ addr = getInetAddress_addr(env, address);
+
+- family = (*env)->GetIntField(env, address, ia_familyID);
++ family = getInetAddress_family(env, address);
+ if (family == IPv6 && !ipv6_supported) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Protocol family not supported");
+@@ -671,7 +671,7 @@
+ return;
+ }
+
+- family = (*env)->GetIntField(env, iaObj, ia_familyID);
++ family = getInetAddress_family(env, iaObj);
+ if (family == IPv4) {
+ fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+ } else {
+@@ -715,7 +715,7 @@
+ if (!w2k_or_later) { /* avoid this check on Win 2K or better. Does not work with IPv6.
+ * Check is not necessary on these OSes */
+ if (connected) {
+- address = (*env)->GetIntField(env, iaObj, ia_addressID);
++ address = getInetAddress_addr(env, iaObj);
+ } else {
+ address = ntohl(rmtaddr.him4.sin_addr.s_addr);
+ }
+@@ -824,7 +824,7 @@
+ if (IS_NULL(addressObj)) {
+ JNU_ThrowNullPointerException(env, "Null address in peek()");
+ } else {
+- address = (*env)->GetIntField(env, addressObj, ia_addressID);
++ address = getInetAddress_addr(env, addressObj);
+ /* We only handle IPv4 for now. Will support IPv6 once its in the os */
+ family = AF_INET;
+ }
+@@ -906,9 +906,8 @@
+ JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException", 0);
+ return 0;
+ }
+- (*env)->SetIntField(env, addressObj, ia_addressID,
+- ntohl(remote_addr.sin_addr.s_addr));
+- (*env)->SetIntField(env, addressObj, ia_familyID, IPv4);
++ setInetAddress_addr(env, addressObj, ntohl(remote_addr.sin_addr.s_addr));
++ setInetAddress_family(env, addressObj, IPv4);
+
+ /* return port */
+ return ntohs(remote_addr.sin_port);
+@@ -1578,7 +1577,6 @@
+ {
+ jobjectArray addrArray;
+ static jfieldID ni_addrsID=0;
+- static jfieldID ia_familyID=0;
+ jsize len;
+ jobject addr;
+ int i;
+@@ -1589,10 +1587,6 @@
+ ni_addrsID = (*env)->GetFieldID(env, c, "addrs",
+ "[Ljava/net/InetAddress;");
+ CHECK_NULL_RETURN (ni_addrsID, -1);
+- c = (*env)->FindClass(env,"java/net/InetAddress");
+- CHECK_NULL_RETURN (c, -1);
+- ia_familyID = (*env)->GetFieldID(env, c, "family", "I");
+- CHECK_NULL_RETURN (ia_familyID, -1);
+ }
+
+ addrArray = (*env)->GetObjectField(env, nif, ni_addrsID);
+@@ -1610,7 +1604,7 @@
+ for (i=0; i<len; i++) {
+ int fam;
+ addr = (*env)->GetObjectArrayElement(env, addrArray, i);
+- fam = (*env)->GetIntField(env, addr, ia_familyID);
++ fam = getInetAddress_family(env, addr);
+ if (fam == family) {
+ *iaddr = addr;
+ return 0;
+@@ -1622,20 +1616,13 @@
+ static int getInet4AddrFromIf (JNIEnv *env, jobject nif, struct in_addr *iaddr)
+ {
+ jobject addr;
+- static jfieldID ia_addressID;
+
+ int ret = getInetAddrFromIf (env, IPv4, nif, &addr);
+ if (ret == -1) {
+ return -1;
+ }
+
+- if (ia_addressID == 0) {
+- jclass c = (*env)->FindClass(env,"java/net/InetAddress");
+- CHECK_NULL_RETURN (c, -1);
+- ia_addressID = (*env)->GetFieldID(env, c, "address", "I");
+- CHECK_NULL_RETURN (ia_addressID, -1);
+- }
+- iaddr->s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID));
++ iaddr->s_addr = htonl(getInetAddress_addr(env, addr));
+ return 0;
+ }
+
+@@ -1710,17 +1697,9 @@
+ }
+ opt = java_net_SocketOptions_IP_MULTICAST_IF2;
+ } else {
+- static jfieldID ia_addressID;
+ struct in_addr in;
+
+- if (ia_addressID == NULL) {
+- jclass c = (*env)->FindClass(env,"java/net/InetAddress");
+- CHECK_NULL(c);
+- ia_addressID = (*env)->GetFieldID(env, c, "address", "I");
+- CHECK_NULL(ia_addressID);
+- }
+-
+- in.s_addr = htonl((*env)->GetIntField(env, value, ia_addressID));
++ in.s_addr = htonl(getInetAddress_addr(env, value));
+
+ if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
+ (const char*)&in, sizeof(in)) < 0) {
+@@ -1949,7 +1928,6 @@
+ if (isIPV4) {
+ static jclass inet4_class;
+ static jmethodID inet4_ctrID;
+- static jfieldID inet4_addrID;
+
+ static jclass ni_class;
+ static jmethodID ni_ctrID;
+@@ -1979,15 +1957,13 @@
+ CHECK_NULL_RETURN(c, NULL);
+ inet4_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V");
+ CHECK_NULL_RETURN(inet4_ctrID, NULL);
+- inet4_addrID = (*env)->GetFieldID(env, c, "address", "I");
+- CHECK_NULL_RETURN(inet4_addrID, NULL);
+ inet4_class = (*env)->NewGlobalRef(env, c);
+ CHECK_NULL_RETURN(inet4_class, NULL);
+ }
+ addr = (*env)->NewObject(env, inet4_class, inet4_ctrID, 0);
+ CHECK_NULL_RETURN(addr, NULL);
+
+- (*env)->SetIntField(env, addr, inet4_addrID, ntohl(in.s_addr));
++ setInetAddress_addr(env, addr, ntohl(in.s_addr));
+
+ /*
+ * For IP_MULTICAST_IF return InetAddress
+diff --git a/src/windows/native/java/net/TwoStacksPlainSocketImpl.c b/src/windows/native/java/net/TwoStacksPlainSocketImpl.c
+--- jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c
++++ jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c
+@@ -410,7 +410,7 @@
+ fdObj = (*env)->GetObjectField(env, this, psi_fdID);
+ fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID);
+
+- family = (*env)->GetIntField(env, iaObj, ia_familyID);
++ family = getInetAddress_family(env, iaObj);
+
+ if (family == IPv6 && !ipv6_supported) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+@@ -722,9 +722,8 @@
+ return;
+ }
+
+- (*env)->SetIntField(env, socketAddressObj, ia_addressID,
+- ntohl(him.him4.sin_addr.s_addr));
+- (*env)->SetIntField(env, socketAddressObj, ia_familyID, IPv4);
++ setInetAddress_addr(env, socketAddressObj, ntohl(him.him4.sin_addr.s_addr));
++ setInetAddress_family(env, socketAddressObj, IPv4);
+ (*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj);
+ } else {
+ jbyteArray addr;
+@@ -752,7 +751,7 @@
+ }
+ addr = (*env)->GetObjectField (env, socketAddressObj, ia6_ipaddressID);
+ (*env)->SetByteArrayRegion (env, addr, 0, 16, (const char *)&him.him6.sin6_addr);
+- (*env)->SetIntField(env, socketAddressObj, ia_familyID, IPv6);
++ setInetAddress_family(env, socketAddressObj, IPv6);
+ (*env)->SetIntField(env, socketAddressObj, ia6_scopeidID, him.him6.sin6_scope_id);
+ }
+ /* fields common to AF_INET and AF_INET6 */
+diff --git a/src/windows/native/java/net/net_util_md.c b/src/windows/native/java/net/net_util_md.c
+--- jdk/src/windows/native/java/net/net_util_md.c
++++ jdk/src/windows/native/java/net/net_util_md.c
+@@ -832,7 +832,7 @@
+ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him,
+ int *len, jboolean v4MappedAddress) {
+ jint family, iafam;
+- iafam = (*env)->GetIntField(env, iaObj, ia_familyID);
++ iafam = getInetAddress_family(env, iaObj);
+ family = (iafam == IPv4)? AF_INET : AF_INET6;
+ if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) {
+ struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
+@@ -843,7 +843,7 @@
+
+ if (family == AF_INET) { /* will convert to IPv4-mapped address */
+ memset((char *) caddr, 0, 16);
+- address = (*env)->GetIntField(env, iaObj, ia_addressID);
++ address = getInetAddress_addr(env, iaObj);
+ if (address == INADDR_ANY) {
+ /* we would always prefer IPv6 wildcard address
+ caddr[10] = 0xff;
+@@ -882,7 +882,7 @@
+ return -1;
+ }
+ memset((char *) him4, 0, sizeof(struct sockaddr_in));
+- address = (int)(*env)->GetIntField(env, iaObj, ia_addressID);
++ address = getInetAddress_addr(env, iaObj);
+ him4->sin_port = htons((short) port);
+ him4->sin_addr.s_addr = (u_long) htonl(address);
+ him4->sin_family = AF_INET;
diff --git a/java/openjdk6/files/icedtea/security/20130416/8001031.patch b/java/openjdk6/files/icedtea/security/20130416/8001031.patch
new file mode 100644
index 000000000000..288c0e749436
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8001031.patch
@@ -0,0 +1,5457 @@
+# HG changeset patch
+# User andrew
+# Date 1365744917 -3600
+# Node ID d79bfc0c6371d1174209585a8d2bf08e3f3625f9
+# Parent ec8a935f0737e033e4ffd401c4d554cd73739c39
+8001031: Better font processing.
+Reviewed-by: vadim, prr, mschoene
+
+diff --git a/src/share/native/sun/font/FontInstanceAdapter.cpp b/src/share/native/sun/font/FontInstanceAdapter.cpp
+--- jdk/src/share/native/sun/font/FontInstanceAdapter.cpp
++++ jdk/src/share/native/sun/font/FontInstanceAdapter.cpp
+@@ -66,8 +66,21 @@
+ yScalePixelsToUnits = upem / yppem;
+ };
+
++
+ const void *FontInstanceAdapter::getFontTable(LETag tableTag) const
+ {
++ size_t ignored = 0;
++ return getFontTable(tableTag, ignored);
++}
++
++static const LETag cacheMap[LAYOUTCACHE_ENTRIES] = {
++ GPOS_TAG, GDEF_TAG, GSUB_TAG, MORT_TAG, MORX_TAG, KERN_TAG
++};
++
++const void *FontInstanceAdapter::getFontTable(LETag tableTag, size_t &length) const
++{
++ length = 0;
++
+ if (!layoutTables) { // t1 font
+ return 0;
+ }
+@@ -75,14 +88,19 @@
+ // cache in font's pscaler object
+ // font disposer will handle for us
+
+- switch(tableTag) {
+- case GSUB_TAG: if (layoutTables->gsub_len != -1) return (void*)layoutTables->gsub; break;
+- case GPOS_TAG: if (layoutTables->gpos_len != -1) return (void*)layoutTables->gpos; break;
+- case GDEF_TAG: if (layoutTables->gdef_len != -1) return (void*)layoutTables->gdef; break;
+- case MORT_TAG: if (layoutTables->mort_len != -1) return (void*)layoutTables->mort; break;
+- case KERN_TAG: if (layoutTables->kern_len != -1) return (void*)layoutTables->kern; break;
+- default:
+- //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag);
++ int cacheIdx;
++ for (cacheIdx=0;cacheIdx<LAYOUTCACHE_ENTRIES;cacheIdx++) {
++ if (tableTag==cacheMap[cacheIdx]) break;
++ }
++
++ if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if found
++ if (layoutTables->entries[cacheIdx].len != -1) {
++ length = layoutTables->entries[cacheIdx].len;
++ return layoutTables->entries[cacheIdx].ptr;
++ }
++ } else {
++ //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag);
++ // (don't load any other tables)
+ return 0;
+ }
+
+@@ -96,16 +114,13 @@
+ env->GetByteArrayRegion(tableBytes, 0, len, result);
+ }
+
+- switch(tableTag) {
+- case GSUB_TAG: layoutTables->gsub = (void*)result; layoutTables->gsub_len = len; break;
+- case GPOS_TAG: layoutTables->gpos = (void*)result; layoutTables->gpos_len = len; break;
+- case GDEF_TAG: layoutTables->gdef = (void*)result; layoutTables->gdef_len = len; break;
+- case MORT_TAG: layoutTables->mort = (void*)result; layoutTables->mort_len = len; break;
+- case KERN_TAG: layoutTables->kern = (void*)result; layoutTables->kern_len = len; break;
+- default: break;
++ if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if cacheable table
++ layoutTables->entries[cacheIdx].len = len;
++ layoutTables->entries[cacheIdx].ptr = (const void*)result;
+ }
+
+- return (void*)result;
++ length = len;
++ return (const void*)result;
+ };
+
+ LEGlyphID FontInstanceAdapter::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const
+diff --git a/src/share/native/sun/font/FontInstanceAdapter.h b/src/share/native/sun/font/FontInstanceAdapter.h
+--- jdk/src/share/native/sun/font/FontInstanceAdapter.h
++++ jdk/src/share/native/sun/font/FontInstanceAdapter.h
+@@ -86,6 +86,7 @@
+ // tables are cached with the native font scaler data
+ // only supports gsub, gpos, gdef, mort tables at present
+ virtual const void *getFontTable(LETag tableTag) const;
++ virtual const void *getFontTable(LETag tableTag, size_t &len) const;
+
+ virtual void *getKernPairs() const {
+ return layoutTables->kernPairs;
+diff --git a/src/share/native/sun/font/fontscalerdefs.h b/src/share/native/sun/font/fontscalerdefs.h
+--- jdk/src/share/native/sun/font/fontscalerdefs.h
++++ jdk/src/share/native/sun/font/fontscalerdefs.h
+@@ -107,20 +107,19 @@
+ #define GPOS_TAG 0x47504F53 /* 'GPOS' */
+ #define GDEF_TAG 0x47444546 /* 'GDEF' */
+ #define MORT_TAG 0x6D6F7274 /* 'mort' */
++#define MORX_TAG 0x6D6F7278 /* 'morx' */
+ #define KERN_TAG 0x6B65726E /* 'kern' */
+
++typedef struct TTLayoutTableCacheEntry {
++ const void* ptr;
++ int len;
++} TTLayoutTableCacheEntry;
++
++#define LAYOUTCACHE_ENTRIES 6
++
+ typedef struct TTLayoutTableCache {
+- void* gsub;
+- void* gpos;
+- void* gdef;
+- void* mort;
+- void* kern;
+- void* kernPairs;
+- int gsub_len;
+- int gpos_len;
+- int gdef_len;
+- int mort_len;
+- int kern_len;
++ TTLayoutTableCacheEntry entries[LAYOUTCACHE_ENTRIES];
++ void* kernPairs;
+ } TTLayoutTableCache;
+
+ #include "sunfontids.h"
+diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp b/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp
+@@ -39,19 +39,20 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 AlternateSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
++le_uint32 AlternateSubstitutionSubtable::process(const LEReferenceTo<AlternateSubstitutionSubtable> &base,
++ GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const
+ {
+ // NOTE: For now, we'll just pick the first alternative...
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
+
+- if (coverageIndex >= 0) {
++ if (coverageIndex >= 0 && LE_SUCCESS(success)) {
+ le_uint16 altSetCount = SWAPW(alternateSetCount);
+
+ if (coverageIndex < altSetCount) {
+ Offset alternateSetTableOffset = SWAPW(alternateSetTableOffsetArray[coverageIndex]);
+- const AlternateSetTable *alternateSetTable =
+- (const AlternateSetTable *) ((char *) this + alternateSetTableOffset);
++ const LEReferenceTo<AlternateSetTable> alternateSetTable(base, success,
++ (const AlternateSetTable *) ((char *) this + alternateSetTableOffset));
+ TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[0]);
+
+ if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate))) {
+diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.h b/src/share/native/sun/font/layout/AlternateSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h
+@@ -51,13 +51,17 @@
+ TTGlyphID alternateArray[ANY_NUMBER];
+ };
+
++LE_VAR_ARRAY(AlternateSetTable, alternateArray)
++
+ struct AlternateSubstitutionSubtable : GlyphSubstitutionSubtable
+ {
+ le_uint16 alternateSetCount;
+ Offset alternateSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(const LEReferenceTo<AlternateSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const;
+ };
+
++LE_VAR_ARRAY(AlternateSubstitutionSubtable, alternateSetTableOffsetArray)
++
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+@@ -58,15 +58,18 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine)
+
+-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
++ le_int32 languageCode, le_int32 typoFlags,
++ const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable,
++ LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount);
+ fFeatureOrder = TRUE;
+ }
+
+-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode,
++ le_int32 languageCode,
+ le_int32 typoFlags, LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success)
+ {
+@@ -88,8 +91,9 @@
+ // Input: characters
+ // Output: characters, char indices, tags
+ // Returns: output character count
+-le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
+- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
++le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count,
++ le_int32 max, le_bool rightToLeft, LEUnicode *&outChars,
++ LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -137,22 +141,21 @@
+ return;
+ }
+
+- if (fGPOSTable != NULL) {
++ if (!fGPOSTable.isEmpty()) {
+ OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success);
+- } else if (fGDEFTable != NULL) {
+- GDEFMarkFilter filter(fGDEFTable);
+-
++ } else if (!fGDEFTable.isEmpty()) {
++ GDEFMarkFilter filter(fGDEFTable, success);
+ adjustMarkGlyphs(glyphStorage, &filter, success);
+ } else {
+- GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+- GDEFMarkFilter filter(gdefTable);
++ LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen);
++ GDEFMarkFilter filter(gdefTable, success);
+
+ adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+ }
+ }
+
+ UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
+- : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success)
++ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success)
+ {
+ fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
+ fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+@@ -232,7 +235,7 @@
+ return;
+ }
+
+- GDEFMarkFilter filter(fGDEFTable);
++ GDEFMarkFilter filter(fGDEFTable, success);
+
+ adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+ }
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.h b/src/share/native/sun/font/layout/ArabicLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h
+@@ -75,7 +75,7 @@
+ * @internal
+ */
+ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+diff --git a/src/share/native/sun/font/layout/ArabicShaping.cpp b/src/share/native/sun/font/layout/ArabicShaping.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicShaping.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicShaping.cpp
+@@ -58,14 +58,16 @@
+ */
+ ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c)
+ {
+- const ClassDefinitionTable *joiningTypes = (const ClassDefinitionTable *) ArabicShaping::shapingTypeTable;
+- le_int32 joiningType = joiningTypes->getGlyphClass(c);
++ LEErrorCode success = LE_NO_ERROR;
++ const LEReferenceTo<ClassDefinitionTable> joiningTypes((const ClassDefinitionTable *) ArabicShaping::shapingTypeTable,
++ ArabicShaping::shapingTypeTableLen);
++ le_int32 joiningType = joiningTypes->getGlyphClass(joiningTypes, c, success);
+
+- if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT) {
+- return ArabicShaping::shapeTypes[joiningType];
+- }
++ if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT && LE_SUCCESS(success)) {
++ return ArabicShaping::shapeTypes[joiningType];
++ }
+
+- return ArabicShaping::ST_NOSHAPE_NONE;
++ return ArabicShaping::ST_NOSHAPE_NONE;
+ }
+
+ #define isolFeatureTag LE_ISOL_FEATURE_TAG
+diff --git a/src/share/native/sun/font/layout/ArabicShaping.h b/src/share/native/sun/font/layout/ArabicShaping.h
+--- jdk/src/share/native/sun/font/layout/ArabicShaping.h
++++ jdk/src/share/native/sun/font/layout/ArabicShaping.h
+@@ -93,6 +93,8 @@
+ static ShapeType getShapeType(LEUnicode c);
+
+ static const le_uint8 shapingTypeTable[];
++ static const size_t shapingTypeTableLen;
++
+ static const ShapeType shapeTypes[];
+
+ static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage);
+diff --git a/src/share/native/sun/font/layout/AttachmentPosnSubtables.h b/src/share/native/sun/font/layout/AttachmentPosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h
+@@ -52,14 +52,14 @@
+ Offset markArrayOffset;
+ Offset baseArrayOffset;
+
+- inline le_int32 getBaseCoverage(LEGlyphID baseGlyphId) const;
++ inline le_int32 getBaseCoverage(const LETableReference &base, LEGlyphID baseGlyphId, LEErrorCode &success) const;
+
+ le_uint32 process(GlyphIterator *glyphIterator) const;
+ };
+
+-inline le_int32 AttachmentPositioningSubtable::getBaseCoverage(LEGlyphID baseGlyphID) const
++inline le_int32 AttachmentPositioningSubtable::getBaseCoverage(const LETableReference &base, LEGlyphID baseGlyphID, LEErrorCode &success) const
+ {
+- return getGlyphCoverage(baseCoverageTableOffset, baseGlyphID);
++ return getGlyphCoverage(base, baseCoverageTableOffset, baseGlyphID, success);
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CanonData.cpp b/src/share/native/sun/font/layout/CanonData.cpp
+--- jdk/src/share/native/sun/font/layout/CanonData.cpp
++++ jdk/src/share/native/sun/font/layout/CanonData.cpp
+@@ -3641,4 +3641,9 @@
+ 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6
+ };
+
++
++const size_t CanonShaping::glyphSubstitutionTableLen = sizeof(glyphSubstitutionTable)/sizeof(glyphSubstitutionTable[0]);
++
++const size_t CanonShaping::glyphDefinitionTableLen = sizeof(glyphDefinitionTable)/sizeof(glyphDefinitionTable[0]);
++
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/CanonShaping.cpp b/src/share/native/sun/font/layout/CanonShaping.cpp
+--- jdk/src/share/native/sun/font/layout/CanonShaping.cpp
++++ jdk/src/share/native/sun/font/layout/CanonShaping.cpp
+@@ -59,15 +59,15 @@
+ void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft,
+ LEUnicode *outChars, LEGlyphStorage &glyphStorage)
+ {
+- const GlyphDefinitionTableHeader *gdefTable = (const GlyphDefinitionTableHeader *) glyphDefinitionTable;
+- const ClassDefinitionTable *classTable = gdefTable->getMarkAttachClassDefinitionTable();
++ LEErrorCode success = LE_NO_ERROR;
++ LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen);
++ LEReferenceTo<ClassDefinitionTable> classTable = gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success);
+ le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount);
+ le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount);
+- LEErrorCode status = LE_NO_ERROR;
+ le_int32 i;
+
+ for (i = 0; i < charCount; i += 1) {
+- combiningClasses[i] = classTable->getGlyphClass((LEGlyphID) inChars[i]);
++ combiningClasses[i] = classTable->getGlyphClass(classTable, (LEGlyphID) inChars[i], success);
+ indices[i] = i;
+ }
+
+@@ -96,7 +96,7 @@
+ le_int32 index = indices[i];
+
+ outChars[i] = inChars[index];
+- glyphStorage.setCharIndex(out, index, status);
++ glyphStorage.setCharIndex(out, index, success);
+ }
+
+ LE_DELETE_ARRAY(indices);
+diff --git a/src/share/native/sun/font/layout/CanonShaping.h b/src/share/native/sun/font/layout/CanonShaping.h
+--- jdk/src/share/native/sun/font/layout/CanonShaping.h
++++ jdk/src/share/native/sun/font/layout/CanonShaping.h
+@@ -42,7 +42,9 @@
+ {
+ public:
+ static const le_uint8 glyphSubstitutionTable[];
++ static const size_t glyphSubstitutionTableLen;
+ static const le_uint8 glyphDefinitionTable[];
++ static const size_t glyphDefinitionTableLen;
+
+ static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft,
+ LEUnicode *outChars, LEGlyphStorage &glyphStorage);
+diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.cpp b/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
+--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp
+@@ -37,24 +37,51 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_int32 ClassDefinitionTable::getGlyphClass(LEGlyphID glyphID) const
++le_int32 ClassDefinitionTable::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const
+ {
++ LEReferenceTo<ClassDefinitionTable> thisRef(base, success);
++ if (LE_FAILURE(success)) return 0;
++
++ switch(SWAPW(classFormat)) {
++ case 0:
++ return 0;
++
++ case 1:
++ {
++ const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success);
++ return f1Table->getGlyphClass(f1Table, glyphID, success);
++ }
++
++ case 2:
++ {
++ const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success);
++ return f2Table->getGlyphClass(f2Table, glyphID, success);
++ }
++
++ default:
++ return 0;
++ }
++}
++
++le_bool ClassDefinitionTable::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const
++{
++ LEReferenceTo<ClassDefinitionTable> thisRef(base, success);
++ if (LE_FAILURE(success)) return 0;
++
+ switch(SWAPW(classFormat)) {
+ case 0:
+ return 0;
+
+ case 1:
+ {
+- const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this;
+-
+- return f1Table->getGlyphClass(glyphID);
++ const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success);
++ return f1Table->hasGlyphClass(f1Table, glyphClass, success);
+ }
+
+ case 2:
+ {
+- const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this;
+-
+- return f2Table->getGlyphClass(glyphID);
++ const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success);
++ return f2Table->hasGlyphClass(f2Table, glyphClass, success);
+ }
+
+ default:
+@@ -62,51 +89,32 @@
+ }
+ }
+
+-le_bool ClassDefinitionTable::hasGlyphClass(le_int32 glyphClass) const
++le_int32 ClassDefFormat1Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const
+ {
+- switch(SWAPW(classFormat)) {
+- case 0:
+- return 0;
++ if(LE_FAILURE(success)) return 0;
+
+- case 1:
+- {
+- const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this;
+-
+- return f1Table->hasGlyphClass(glyphClass);
+- }
+-
+- case 2:
+- {
+- const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this;
+-
+- return f2Table->hasGlyphClass(glyphClass);
+- }
+-
+- default:
+- return 0;
+- }
+-}
+-
+-le_int32 ClassDefFormat1Table::getGlyphClass(LEGlyphID glyphID) const
+-{
++ le_uint16 count = SWAPW(glyphCount);
++ LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count);
+ TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID);
+ TTGlyphID firstGlyph = SWAPW(startGlyph);
+- TTGlyphID lastGlyph = firstGlyph + SWAPW(glyphCount);
++ TTGlyphID lastGlyph = firstGlyph + count;
+
+- if (ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) {
+- return SWAPW(classValueArray[ttGlyphID - firstGlyph]);
++ if (LE_SUCCESS(success) && ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) {
++ return SWAPW( classValueArrayRef(ttGlyphID - firstGlyph, success) );
+ }
+
+ return 0;
+ }
+
+-le_bool ClassDefFormat1Table::hasGlyphClass(le_int32 glyphClass) const
++le_bool ClassDefFormat1Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const
+ {
+- le_uint16 count = SWAPW(glyphCount);
++ if(LE_FAILURE(success)) return 0;
++ le_uint16 count = SWAPW(glyphCount);
++ LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count);
+ int i;
+
+- for (i = 0; i < count; i += 1) {
+- if (SWAPW(classValueArray[i]) == glyphClass) {
++ for (i = 0; LE_SUCCESS(success)&& (i < count); i += 1) {
++ if (SWAPW(classValueArrayRef(i,success)) == glyphClass) {
+ return TRUE;
+ }
+ }
+@@ -114,27 +122,31 @@
+ return FALSE;
+ }
+
+-le_int32 ClassDefFormat2Table::getGlyphClass(LEGlyphID glyphID) const
++le_int32 ClassDefFormat2Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const
+ {
++ if(LE_FAILURE(success)) return 0;
+ TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphID);
+ le_uint16 rangeCount = SWAPW(classRangeCount);
++ LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount);
+ le_int32 rangeIndex =
+- OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArray, rangeCount);
++ OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArrayRef, success);
+
+- if (rangeIndex < 0) {
++ if (rangeIndex < 0 || LE_FAILURE(success)) {
+ return 0;
+ }
+
+- return SWAPW(classRangeRecordArray[rangeIndex].rangeValue);
++ return SWAPW(classRangeRecordArrayRef(rangeIndex, success).rangeValue);
+ }
+
+-le_bool ClassDefFormat2Table::hasGlyphClass(le_int32 glyphClass) const
++le_bool ClassDefFormat2Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const
+ {
++ if(LE_FAILURE(success)) return 0;
+ le_uint16 rangeCount = SWAPW(classRangeCount);
++ LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount);
+ int i;
+
+- for (i = 0; i < rangeCount; i += 1) {
+- if (SWAPW(classRangeRecordArray[i].rangeValue) == glyphClass) {
++ for (i = 0; i < rangeCount && LE_SUCCESS(success); i += 1) {
++ if (SWAPW(classRangeRecordArrayRef(i,success).rangeValue) == glyphClass) {
+ return TRUE;
+ }
+ }
+diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.h b/src/share/native/sun/font/layout/ClassDefinitionTables.h
+--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h
++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h
+@@ -46,8 +46,20 @@
+ {
+ le_uint16 classFormat;
+
+- le_int32 getGlyphClass(LEGlyphID glyphID) const;
+- le_bool hasGlyphClass(le_int32 glyphClass) const;
++ le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const;
++ le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const;
++
++ le_int32 getGlyphClass(LEGlyphID glyphID) const {
++ LETableReference base((const le_uint8*)this);
++ LEErrorCode ignored = LE_NO_ERROR;
++ return getGlyphClass(base,glyphID,ignored);
++ }
++
++ le_bool hasGlyphClass(le_int32 glyphClass) const {
++ LETableReference base((const le_uint8*)this);
++ LEErrorCode ignored = LE_NO_ERROR;
++ return hasGlyphClass(base,glyphClass,ignored);
++ }
+ };
+
+ struct ClassDefFormat1Table : ClassDefinitionTable
+@@ -56,9 +68,11 @@
+ le_uint16 glyphCount;
+ le_uint16 classValueArray[ANY_NUMBER];
+
+- le_int32 getGlyphClass(LEGlyphID glyphID) const;
+- le_bool hasGlyphClass(le_int32 glyphClass) const;
++ le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const;
++ le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(ClassDefFormat1Table, classValueArray)
++
+
+ struct ClassRangeRecord
+ {
+@@ -72,9 +86,10 @@
+ le_uint16 classRangeCount;
+ GlyphRangeRecord classRangeRecordArray[ANY_NUMBER];
+
+- le_int32 getGlyphClass(LEGlyphID glyphID) const;
+- le_bool hasGlyphClass(le_int32 glyphClass) const;
++ le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const;
++ le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(ClassDefFormat2Table, classRangeRecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp
+@@ -43,13 +43,18 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor)
+
+-ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : StateTableProcessor(morphSubtableHeader)
++ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : StateTableProcessor(morphSubtableHeader, success), entryTable(), contextualGlyphSubstitutionHeader(morphSubtableHeader, success)
+ {
+- contextualGlyphSubstitutionHeader = (const ContextualGlyphSubstitutionHeader *) morphSubtableHeader;
+- substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset);
++ contextualGlyphSubstitutionHeader.orphan();
++ substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset);
+
+- entryTable = (const ContextualGlyphSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset);
++
++ entryTable = LEReferenceToArrayOf<ContextualGlyphSubstitutionStateEntry>(stateTableHeader, success,
++ (const ContextualGlyphSubstitutionStateEntry*)(&stateTableHeader->stHeader),
++ entryTableOffset, LE_UNBOUNDED_ARRAY);
++ int16Table = LEReferenceToArrayOf<le_int16>(stateTableHeader, success, (const le_int16*)(&stateTableHeader->stHeader),
++ 0, LE_UNBOUNDED_ARRAY); // rest of the table as le_int16s
+ }
+
+ ContextualGlyphSubstitutionProcessor::~ContextualGlyphSubstitutionProcessor()
+@@ -63,27 +68,26 @@
+
+ ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
+ {
+- const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index];
+- ByteOffset newState = SWAPW(entry->newStateOffset);
+- le_int16 flags = SWAPW(entry->flags);
+- WordOffset markOffset = SWAPW(entry->markOffset);
+- WordOffset currOffset = SWAPW(entry->currOffset);
++ LEErrorCode success = LE_NO_ERROR;
++ const ContextualGlyphSubstitutionStateEntry *entry = entryTable.getAlias(index, success);
++ ByteOffset newState = SWAPW(entry->newStateOffset);
++ le_int16 flags = SWAPW(entry->flags);
++ WordOffset markOffset = SWAPW(entry->markOffset);
++ WordOffset currOffset = SWAPW(entry->currOffset);
+
+- if (markOffset != 0) {
+- const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + markOffset * 2);
+- LEGlyphID mGlyph = glyphStorage[markGlyph];
+- TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(mGlyph)]);
++ if (markOffset != 0 && LE_SUCCESS(success)) {
++ LEGlyphID mGlyph = glyphStorage[markGlyph];
++ TTGlyphID newGlyph = SWAPW(int16Table.getObject(markOffset + LE_GET_GLYPH(mGlyph), success)); // whew.
+
+- glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph);
+- }
++ glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph);
++ }
+
+- if (currOffset != 0) {
+- const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + currOffset * 2);
+- LEGlyphID thisGlyph = glyphStorage[currGlyph];
+- TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(thisGlyph)]);
++ if (currOffset != 0) {
++ LEGlyphID thisGlyph = glyphStorage[currGlyph];
++ TTGlyphID newGlyph = SWAPW(int16Table.getObject(currOffset + LE_GET_GLYPH(thisGlyph), success)); // whew.
+
+- glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
+- }
++ glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
++ }
+
+ if (flags & cgsSetMark) {
+ markGlyph = currGlyph;
+diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h
+--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h
+@@ -56,7 +56,7 @@
+
+ virtual void endStateTable();
+
+- ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ ContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+ virtual ~ContextualGlyphSubstitutionProcessor();
+
+ /**
+@@ -78,11 +78,11 @@
+
+ protected:
+ ByteOffset substitutionTableOffset;
+- const ContextualGlyphSubstitutionStateEntry *entryTable;
+-
++ LEReferenceToArrayOf<ContextualGlyphSubstitutionStateEntry> entryTable;
++ LEReferenceToArrayOf<le_int16> int16Table;
+ le_int32 markGlyph;
+
+- const ContextualGlyphSubstitutionHeader *contextualGlyphSubstitutionHeader;
++ LEReferenceTo<ContextualGlyphSubstitutionHeader> contextualGlyphSubstitutionHeader;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp b/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+@@ -217,7 +217,7 @@
+ }
+
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success);
+
+ if (coverageIndex >= 0) {
+ le_uint16 srSetCount = SWAPW(subRuleSetCount);
+@@ -266,7 +266,7 @@
+ }
+
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success);
+
+ if (coverageIndex >= 0) {
+ const ClassDefinitionTable *classDefinitionTable =
+@@ -394,7 +394,7 @@
+ }
+
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success);
+
+ if (coverageIndex >= 0) {
+ le_uint16 srSetCount = SWAPW(chainSubRuleSetCount);
+@@ -465,7 +465,7 @@
+ }
+
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success);
+
+ if (coverageIndex >= 0) {
+ const ClassDefinitionTable *backtrackClassDefinitionTable =
+diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.h b/src/share/native/sun/font/layout/ContextualSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
+@@ -43,6 +43,7 @@
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphIterator.h"
+ #include "LookupProcessor.h"
++#include "LETableReference.h"
+
+ U_NAMESPACE_BEGIN
+
+@@ -88,6 +89,8 @@
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
++LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
++
+
+ struct SubRuleSetTable
+ {
+@@ -95,6 +98,7 @@
+ Offset subRuleTableOffsetArray[ANY_NUMBER];
+
+ };
++LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)
+
+ // NOTE: Multiple variable size arrays!!
+ struct SubRuleTable
+@@ -104,6 +108,7 @@
+ TTGlyphID inputGlyphArray[ANY_NUMBER];
+ //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SubRuleTable, inputGlyphArray)
+
+ struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
+ {
+@@ -113,12 +118,16 @@
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
++LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
++
+
+ struct SubClassSetTable
+ {
+ le_uint16 subClassRuleCount;
+ Offset subClassRuleTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)
++
+
+ // NOTE: Multiple variable size arrays!!
+ struct SubClassRuleTable
+@@ -128,6 +137,8 @@
+ le_uint16 classArray[ANY_NUMBER];
+ //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SubClassRuleTable, classArray)
++
+
+ // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
+ // it has an array of coverage tables instead of a single coverage table...
+@@ -143,6 +154,7 @@
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
++LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
+
+ struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
+ {
+@@ -156,6 +168,8 @@
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
++LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
++
+
+ struct ChainSubRuleSetTable
+ {
+@@ -163,6 +177,7 @@
+ Offset chainSubRuleTableOffsetArray[ANY_NUMBER];
+
+ };
++LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)
+
+ // NOTE: Multiple variable size arrays!!
+ struct ChainSubRuleTable
+@@ -176,6 +191,7 @@
+ //le_uint16 substCount;
+ //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)
+
+ struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable
+ {
+@@ -187,12 +203,15 @@
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
++LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
+
+ struct ChainSubClassSetTable
+ {
+ le_uint16 chainSubClassRuleCount;
+ Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)
++
+
+ // NOTE: Multiple variable size arrays!!
+ struct ChainSubClassRuleTable
+@@ -206,6 +225,7 @@
+ //le_uint16 substCount;
+ //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray)
+
+ // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
+ // it has arrays of coverage tables instead of a single coverage table...
+@@ -225,6 +245,8 @@
+
+ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+ };
++LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
++
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/CoverageTables.h b/src/share/native/sun/font/layout/CoverageTables.h
+--- jdk/src/share/native/sun/font/layout/CoverageTables.h
++++ jdk/src/share/native/sun/font/layout/CoverageTables.h
+@@ -56,6 +56,8 @@
+
+ le_int32 getGlyphCoverage(LEGlyphID glyphID) const;
+ };
++LE_VAR_ARRAY(CoverageFormat1Table, glyphArray)
++
+
+ struct CoverageFormat2Table : CoverageTable
+ {
+@@ -64,6 +66,7 @@
+
+ le_int32 getGlyphCoverage(LEGlyphID glyphID) const;
+ };
++LE_VAR_ARRAY(CoverageFormat2Table, rangeRecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp
+@@ -39,10 +39,10 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 CursiveAttachmentSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 CursiveAttachmentSubtable::process(const LEReferenceTo<CursiveAttachmentSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID glyphID = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyphID);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyphID, success);
+ le_uint16 eeCount = SWAPW(entryExitCount);
+
+ if (coverageIndex < 0 || coverageIndex >= eeCount) {
+@@ -51,7 +51,7 @@
+ }
+
+ LEPoint entryAnchor, exitAnchor;
+- Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor);
++ Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor); // TODO
+ Offset exitOffset = SWAPW(entryExitRecords[coverageIndex].exitAnchor);
+
+ if (entryOffset != 0) {
+diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h
+--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h
++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h
+@@ -57,8 +57,9 @@
+ le_uint16 entryExitCount;
+ EntryExitRecord entryExitRecords[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<CursiveAttachmentSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(CursiveAttachmentSubtable, entryExitRecords)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/DeviceTables.h b/src/share/native/sun/font/layout/DeviceTables.h
+--- jdk/src/share/native/sun/font/layout/DeviceTables.h
++++ jdk/src/share/native/sun/font/layout/DeviceTables.h
+@@ -57,6 +57,7 @@
+ static const le_uint16 fieldSignBits[];
+ static const le_uint16 fieldBits[];
+ };
++LE_VAR_ARRAY(DeviceTable, deltaValues)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.cpp b/src/share/native/sun/font/layout/ExtensionSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp
+@@ -47,6 +47,8 @@
+ le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType,
+ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
++ const LEReferenceTo<ExtensionSubtable> thisRef(lookupProcessor->getReference(), success); // create a reference to this
++
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+@@ -55,9 +57,11 @@
+
+ if (elt != lookupType) {
+ le_uint32 extOffset = READ_LONG(extensionOffset);
+- LookupSubtable *subtable = (LookupSubtable *) ((char *) this + extOffset);
++ LEReferenceTo<LookupSubtable> subtable(thisRef, success, extOffset);
+
+- return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success);
++ if(LE_SUCCESS(success)) {
++ return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success);
++ }
+ }
+
+ return 0;
+diff --git a/src/share/native/sun/font/layout/Features.cpp b/src/share/native/sun/font/layout/Features.cpp
+--- jdk/src/share/native/sun/font/layout/Features.cpp
++++ jdk/src/share/native/sun/font/layout/Features.cpp
+@@ -38,19 +38,20 @@
+
+ U_NAMESPACE_BEGIN
+
+-const FeatureTable *FeatureListTable::getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const
++LEReferenceTo<FeatureTable> FeatureListTable::getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const
+ {
+- if (featureIndex >= SWAPW(featureCount)) {
+- return 0;
+- }
++ if (featureIndex >= SWAPW(featureCount) || LE_FAILURE(success)) {
++ return LEReferenceTo<FeatureTable>();
++ }
+
+ Offset featureTableOffset = featureRecordArray[featureIndex].featureTableOffset;
+
+ *featureTag = SWAPT(featureRecordArray[featureIndex].featureTag);
+
+- return (const FeatureTable *) ((char *) this + SWAPW(featureTableOffset));
++ return LEReferenceTo<FeatureTable>(base, success, SWAPW(featureTableOffset));
+ }
+
++#if 0
+ /*
+ * Note: according to the OpenType Spec. v 1.4, the entries in the Feature
+ * List Table are sorted alphabetically by feature tag; however, there seem
+@@ -82,5 +83,6 @@
+ return 0;
+ #endif
+ }
++#endif
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.cpp b/src/share/native/sun/font/layout/GDEFMarkFilter.cpp
+--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp
++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp
+@@ -36,9 +36,12 @@
+
+ U_NAMESPACE_BEGIN
+
+-GDEFMarkFilter::GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable)
++GDEFMarkFilter::GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success)
++ : classDefTable(gdefTable->getGlyphClassDefinitionTable(gdefTable, success))
+ {
+- classDefTable = gdefTable->getGlyphClassDefinitionTable();
++ if(!classDefTable.isValid()) {
++ success = LE_INTERNAL_ERROR;
++ }
+ }
+
+ GDEFMarkFilter::~GDEFMarkFilter()
+diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.h b/src/share/native/sun/font/layout/GDEFMarkFilter.h
+--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h
++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h
+@@ -46,13 +46,13 @@
+ class GDEFMarkFilter : public UMemory, public LEGlyphFilter
+ {
+ private:
+- const GlyphClassDefinitionTable *classDefTable;
++ const LEReferenceTo<GlyphClassDefinitionTable> classDefTable;
+
+ GDEFMarkFilter(const GDEFMarkFilter &other); // forbid copying of this class
+ GDEFMarkFilter &operator=(const GDEFMarkFilter &other); // forbid copying of this class
+
+ public:
+- GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable);
++ GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success);
+ virtual ~GDEFMarkFilter();
+
+ virtual le_bool accept(LEGlyphID glyph) const;
+diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.cpp b/src/share/native/sun/font/layout/GXLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp
+@@ -41,9 +41,10 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine)
+
+-GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success)
++ GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader> &morphTable, LEErrorCode &success)
+ : LayoutEngine(fontInstance, scriptCode, languageCode, 0, success), fMorphTable(morphTable)
+ {
++ fMorphTable.orphan();
+ // nothing else to do?
+ }
+
+@@ -70,7 +71,7 @@
+ return 0;
+ }
+
+- fMorphTable->process(glyphStorage);
++ fMorphTable->process(fMorphTable, glyphStorage, success);
+
+ return count;
+ }
+diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.h b/src/share/native/sun/font/layout/GXLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.h
+@@ -74,7 +74,7 @@
+ *
+ * @internal
+ */
+- GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success);
++ GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader> &morphTable, LEErrorCode &success);
+
+ /**
+ * The destructor, virtual for correct polymorphic invocation.
+@@ -104,7 +104,7 @@
+ *
+ * @internal
+ */
+- const MorphTableHeader *fMorphTable;
++ LEReferenceTo<MorphTableHeader> fMorphTable;
+
+ /**
+ * This method does GX layout using the font's 'mort' table. It converts the
+diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp b/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp
+@@ -36,24 +36,36 @@
+
+ U_NAMESPACE_BEGIN
+
+-const GlyphClassDefinitionTable *GlyphDefinitionTableHeader::getGlyphClassDefinitionTable() const
++const LEReferenceTo<GlyphClassDefinitionTable>
++GlyphDefinitionTableHeader::getGlyphClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const
+ {
+- return (const GlyphClassDefinitionTable *) ((char *) this + SWAPW(glyphClassDefOffset));
++ if(LE_FAILURE(success)) return LEReferenceTo<GlyphClassDefinitionTable>();
++ return LEReferenceTo<GlyphClassDefinitionTable>(base, success, SWAPW(glyphClassDefOffset));
+ }
+
+-const AttachmentListTable *GlyphDefinitionTableHeader::getAttachmentListTable() const
++const LEReferenceTo<AttachmentListTable>
++GlyphDefinitionTableHeader::getAttachmentListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const
+ {
+- return (const AttachmentListTable *) ((char *) this + SWAPW(attachListOffset));
++ if(LE_FAILURE(success)) return LEReferenceTo<AttachmentListTable>();
++ return LEReferenceTo<AttachmentListTable>(base, success, SWAPW(attachListOffset));
+ }
+
+-const LigatureCaretListTable *GlyphDefinitionTableHeader::getLigatureCaretListTable() const
++const LEReferenceTo<LigatureCaretListTable>
++GlyphDefinitionTableHeader::getLigatureCaretListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const
+ {
+- return (const LigatureCaretListTable *) ((char *) this + SWAPW(ligCaretListOffset));
++ if(LE_FAILURE(success)) return LEReferenceTo<LigatureCaretListTable>();
++ return LEReferenceTo<LigatureCaretListTable>(base, success, SWAPW(ligCaretListOffset));
+ }
+
+-const MarkAttachClassDefinitionTable *GlyphDefinitionTableHeader::getMarkAttachClassDefinitionTable() const
++const LEReferenceTo<MarkAttachClassDefinitionTable>
++GlyphDefinitionTableHeader::getMarkAttachClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const
+ {
+- return (const MarkAttachClassDefinitionTable *) ((char *) this + SWAPW(MarkAttachClassDefOffset));
++ if(LE_FAILURE(success)) return LEReferenceTo<MarkAttachClassDefinitionTable>();
++ return LEReferenceTo<MarkAttachClassDefinitionTable>(base, success, SWAPW(MarkAttachClassDefOffset));
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.h b/src/share/native/sun/font/layout/GlyphDefinitionTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h
+@@ -60,12 +60,14 @@
+ le_uint16 glyphCount;
+ Offset attachPointTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(AttachmentListTable, attachPointTableOffsetArray)
+
+ struct AttachPointTable
+ {
+ le_uint16 pointCount;
+ le_uint16 pointIndexArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(AttachPointTable, pointIndexArray)
+
+ struct LigatureCaretListTable
+ {
+@@ -73,12 +75,14 @@
+ le_uint16 ligGlyphCount;
+ Offset ligGlyphTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LigatureCaretListTable, ligGlyphTableOffsetArray)
+
+ struct LigatureGlyphTable
+ {
+ le_uint16 caretCount;
+ Offset caretValueTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LigatureGlyphTable, caretValueTableOffsetArray)
+
+ struct CaretValueTable
+ {
+@@ -111,10 +115,18 @@
+ Offset ligCaretListOffset;
+ Offset MarkAttachClassDefOffset;
+
+- const GlyphClassDefinitionTable *getGlyphClassDefinitionTable() const;
+- const AttachmentListTable *getAttachmentListTable()const ;
+- const LigatureCaretListTable *getLigatureCaretListTable() const;
+- const MarkAttachClassDefinitionTable *getMarkAttachClassDefinitionTable() const;
++ const LEReferenceTo<GlyphClassDefinitionTable>
++ getGlyphClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const;
++ const LEReferenceTo<AttachmentListTable>
++ getAttachmentListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success)const ;
++ const LEReferenceTo<LigatureCaretListTable>
++ getLigatureCaretListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const;
++ const LEReferenceTo<MarkAttachClassDefinitionTable>
++ getMarkAttachClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base,
++ LEErrorCode &success) const;
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphIterator.cpp b/src/share/native/sun/font/layout/GlyphIterator.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphIterator.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphIterator.cpp
+@@ -41,18 +41,21 @@
+ U_NAMESPACE_BEGIN
+
+ GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
+- FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
++ FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader)
+ : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
+ glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
+ srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0),
+- glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL)
++ glyphClassDefinitionTable(), markAttachClassDefinitionTable()
+
+ {
++ LEErrorCode success = LE_NO_ERROR; // TODO
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+
+- if (theGlyphDefinitionTableHeader != NULL) {
+- glyphClassDefinitionTable = theGlyphDefinitionTableHeader->getGlyphClassDefinitionTable();
+- markAttachClassDefinitionTable = theGlyphDefinitionTableHeader->getMarkAttachClassDefinitionTable();
++ if (theGlyphDefinitionTableHeader.isValid()) {
++ glyphClassDefinitionTable = theGlyphDefinitionTableHeader
++ -> getGlyphClassDefinitionTable(theGlyphDefinitionTableHeader, success);
++ markAttachClassDefinitionTable = theGlyphDefinitionTableHeader
++ ->getMarkAttachClassDefinitionTable(theGlyphDefinitionTableHeader, success);
+ }
+
+ nextLimit = glyphCount;
+@@ -380,6 +383,7 @@
+
+ le_bool GlyphIterator::filterGlyph(le_uint32 index) const
+ {
++ LEErrorCode success = LE_NO_ERROR;
+ LEGlyphID glyphID = glyphStorage[index];
+ le_int32 glyphClass = gcdNoGlyphClass;
+
+@@ -387,8 +391,8 @@
+ return TRUE;
+ }
+
+- if (glyphClassDefinitionTable != NULL) {
+- glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphID);
++ if (glyphClassDefinitionTable.isValid()) {
++ glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphClassDefinitionTable, glyphID, success);
+ }
+
+ switch (glyphClass)
+@@ -410,8 +414,9 @@
+
+ le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift;
+
+- if ((markAttachType != 0) && (markAttachClassDefinitionTable != NULL)) {
+- return markAttachClassDefinitionTable->getGlyphClass(glyphID) != markAttachType;
++ if ((markAttachType != 0) && (markAttachClassDefinitionTable.isValid())) {
++ return markAttachClassDefinitionTable
++ -> getGlyphClass(markAttachClassDefinitionTable, glyphID, success) != markAttachType;
+ }
+
+ return FALSE;
+@@ -461,6 +466,7 @@
+ while (newPosition != nextLimit && delta > 0) {
+ do {
+ newPosition += direction;
++ //fprintf(stderr,"%s:%d:%s: newPosition = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, newPosition, delta);
+ } while (newPosition != nextLimit && filterGlyph(newPosition));
+
+ delta -= 1;
+@@ -468,6 +474,7 @@
+
+ position = newPosition;
+
++ //fprintf(stderr,"%s:%d:%s: exit position = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, position, delta);
+ return position != nextLimit;
+ }
+
+@@ -483,6 +490,7 @@
+ while (newPosition != prevLimit && delta > 0) {
+ do {
+ newPosition -= direction;
++ //fprintf(stderr,"%s:%d:%s: newPosition = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, newPosition, delta);
+ } while (newPosition != prevLimit && filterGlyph(newPosition));
+
+ delta -= 1;
+@@ -490,6 +498,7 @@
+
+ position = newPosition;
+
++ //fprintf(stderr,"%s:%d:%s: exit position = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, position, delta);
+ return position != prevLimit;
+ }
+
+diff --git a/src/share/native/sun/font/layout/GlyphIterator.h b/src/share/native/sun/font/layout/GlyphIterator.h
+--- jdk/src/share/native/sun/font/layout/GlyphIterator.h
++++ jdk/src/share/native/sun/font/layout/GlyphIterator.h
+@@ -49,7 +49,7 @@
+ class GlyphIterator : public UMemory {
+ public:
+ GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
+- FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader);
++ FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader);
+
+ GlyphIterator(GlyphIterator &that);
+
+@@ -117,8 +117,8 @@
+ FeatureMask featureMask;
+ le_int32 glyphGroup;
+
+- const GlyphClassDefinitionTable *glyphClassDefinitionTable;
+- const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable;
++ LEReferenceTo<GlyphClassDefinitionTable> glyphClassDefinitionTable;
++ LEReferenceTo<MarkAttachClassDefinitionTable> markAttachClassDefinitionTable;
+
+ GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class
+ };
+diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.cpp b/src/share/native/sun/font/layout/GlyphLookupTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp
+@@ -37,21 +37,22 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_bool GlyphLookupTableHeader::coversScript(LETag scriptTag) const
++le_bool GlyphLookupTableHeader::coversScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const
+ {
+- const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset));
++ LEReferenceTo<ScriptListTable> scriptListTable(base, success, SWAPW(scriptListOffset));
+
+- return scriptListOffset != 0 && scriptListTable->findScript(scriptTag) != NULL;
++ return (scriptListOffset != 0) && scriptListTable->findScript(scriptListTable, scriptTag, success) .isValid();
+ }
+
+-le_bool GlyphLookupTableHeader::coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const
++le_bool GlyphLookupTableHeader::coversScriptAndLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const
+ {
+- const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset));
+- const LangSysTable *langSysTable = scriptListTable->findLanguage(scriptTag, languageTag, exactMatch);
++ LEReferenceTo<ScriptListTable> scriptListTable(base, success, SWAPW(scriptListOffset));
++ LEReferenceTo<LangSysTable> langSysTable = scriptListTable->findLanguage(scriptListTable,
++ scriptTag, languageTag, success, exactMatch);
+
+ // FIXME: could check featureListOffset, lookupListOffset, and lookup count...
+ // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero.
+- return langSysTable != NULL && langSysTable->featureCount != 0;
++ return LE_SUCCESS(success)&&langSysTable.isValid() && langSysTable->featureCount != 0;
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.h b/src/share/native/sun/font/layout/GlyphLookupTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.h
+@@ -49,8 +49,8 @@
+ Offset featureListOffset;
+ Offset lookupListOffset;
+
+- le_bool coversScript(LETag scriptTag) const;
+- le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const;
++ le_bool coversScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const;
++ le_bool coversScriptAndLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const;
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.cpp b/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp
+@@ -41,16 +41,16 @@
+
+ U_NAMESPACE_BEGIN
+
+-void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft,
++void GlyphPositioningTableHeader::process(const LEReferenceTo<GlyphPositioningTableHeader> &base, LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft,
+ LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success,
++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, LEErrorCode &success,
+ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const
+ {
+ if (LE_FAILURE(success)) {
+ return;
+ }
+
+- GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success);
++ GlyphPositioningLookupProcessor processor(base, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success);
+ if (LE_FAILURE(success)) {
+ return;
+ }
+diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.h b/src/share/native/sun/font/layout/GlyphPositioningTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h
+@@ -40,6 +40,7 @@
+ #include "OpenTypeTables.h"
+ #include "Lookups.h"
+ #include "GlyphLookupTables.h"
++#include "LETableReference.h"
+
+ U_NAMESPACE_BEGIN
+
+@@ -51,9 +52,9 @@
+
+ struct GlyphPositioningTableHeader : public GlyphLookupTableHeader
+ {
+- void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
++ void process(const LEReferenceTo<GlyphPositioningTableHeader> &base, LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+ le_bool rightToLeft, LETag scriptTag, LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success,
++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, LEErrorCode &success,
+ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const;
+ };
+
+diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp b/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp
+@@ -57,7 +57,7 @@
+ typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable;
+
+ GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor(
+- const GlyphPositioningTableHeader *glyphPositioningTableHeader,
++ const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader,
+ LETag scriptTag,
+ LETag languageTag,
+ const FeatureMap *featureMap,
+@@ -65,7 +65,7 @@
+ le_bool featureOrder,
+ LEErrorCode& success)
+ : LookupProcessor(
+- (char *) glyphPositioningTableHeader,
++ glyphPositioningTableHeader,
+ SWAPW(glyphPositioningTableHeader->scriptListOffset),
+ SWAPW(glyphPositioningTableHeader->featureListOffset),
+ SWAPW(glyphPositioningTableHeader->lookupListOffset),
+@@ -84,7 +84,7 @@
+ {
+ }
+
+-le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType,
++le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType,
+ GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance,
+ LEErrorCode& success) const
+@@ -102,55 +102,55 @@
+
+ case gpstSingle:
+ {
+- const SinglePositioningSubtable *subtable = (const SinglePositioningSubtable *) lookupSubtable;
++ LEReferenceTo<SinglePositioningSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fontInstance);
++ delta = subtable->process(subtable, glyphIterator, fontInstance, success);
+ break;
+ }
+
+ case gpstPair:
+ {
+- const PairPositioningSubtable *subtable = (const PairPositioningSubtable *) lookupSubtable;
++ LEReferenceTo<PairPositioningSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fontInstance);
++ delta = subtable->process(subtable, glyphIterator, fontInstance, success);
+ break;
+ }
+
+ case gpstCursive:
+ {
+- const CursiveAttachmentSubtable *subtable = (const CursiveAttachmentSubtable *) lookupSubtable;
++ LEReferenceTo<CursiveAttachmentSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fontInstance);
++ delta = subtable->process(subtable, glyphIterator, fontInstance, success);
+ break;
+ }
+
+ case gpstMarkToBase:
+ {
+- const MarkToBasePositioningSubtable *subtable = (const MarkToBasePositioningSubtable *) lookupSubtable;
++ LEReferenceTo<MarkToBasePositioningSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fontInstance);
++ delta = subtable->process(subtable, glyphIterator, fontInstance, success);
+ break;
+ }
+
+ case gpstMarkToLigature:
+ {
+- const MarkToLigaturePositioningSubtable *subtable = (const MarkToLigaturePositioningSubtable *) lookupSubtable;
++ LEReferenceTo<MarkToLigaturePositioningSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fontInstance);
++ delta = subtable->process(subtable, glyphIterator, fontInstance, success);
+ break;
+ }
+
+ case gpstMarkToMark:
+ {
+- const MarkToMarkPositioningSubtable *subtable = (const MarkToMarkPositioningSubtable *) lookupSubtable;
++ LEReferenceTo<MarkToMarkPositioningSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fontInstance);
++ delta = subtable->process(subtable, glyphIterator, fontInstance, success);
+ break;
+ }
+
+ case gpstContext:
+ {
+- const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable;
++ LEReferenceTo<ContextualPositioningSubtable> subtable(lookupSubtable, success);
+
+ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+@@ -158,7 +158,7 @@
+
+ case gpstChainedContext:
+ {
+- const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable;
++ LEReferenceTo<ChainingContextualPositioningSubtable> subtable(lookupSubtable, success);
+
+ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+@@ -166,7 +166,7 @@
+
+ case gpstExtension:
+ {
+- const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable;
++ LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success);
+
+ delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success);
+ break;
+diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.h b/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
+--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h
+@@ -51,7 +51,7 @@
+ class GlyphPositioningLookupProcessor : public LookupProcessor
+ {
+ public:
+- GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader,
++ GlyphPositioningLookupProcessor(const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader,
+ LETag scriptTag,
+ LETag languageTag,
+ const FeatureMap *featureMap,
+@@ -61,7 +61,7 @@
+
+ virtual ~GlyphPositioningLookupProcessor();
+
+- virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator,
++ virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+ protected:
+diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp b/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp
+@@ -51,7 +51,7 @@
+ U_NAMESPACE_BEGIN
+
+ GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor(
+- const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader,
++ const LEReferenceTo<GlyphSubstitutionTableHeader> &glyphSubstitutionTableHeader,
+ LETag scriptTag,
+ LETag languageTag,
+ const LEGlyphFilter *filter,
+@@ -60,7 +60,7 @@
+ le_bool featureOrder,
+ LEErrorCode& success)
+ : LookupProcessor(
+- (char *) glyphSubstitutionTableHeader,
++ glyphSubstitutionTableHeader,
+ SWAPW(glyphSubstitutionTableHeader->scriptListOffset),
+ SWAPW(glyphSubstitutionTableHeader->featureListOffset),
+ SWAPW(glyphSubstitutionTableHeader->lookupListOffset),
+@@ -73,7 +73,7 @@
+ {
+ }
+
+-le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType,
++le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType,
+ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
+ if (LE_FAILURE(success)) {
+@@ -89,39 +89,39 @@
+
+ case gsstSingle:
+ {
+- const SingleSubstitutionSubtable *subtable = (const SingleSubstitutionSubtable *) lookupSubtable;
++ const LEReferenceTo<SingleSubstitutionSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fFilter);
++ delta = subtable->process(subtable, glyphIterator, success, fFilter);
+ break;
+ }
+
+ case gsstMultiple:
+ {
+- const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable;
++ const LEReferenceTo<MultipleSubstitutionSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, success, fFilter);
++ delta = subtable->process(subtable, glyphIterator, success, fFilter);
+ break;
+ }
+
+ case gsstAlternate:
+ {
+- const AlternateSubstitutionSubtable *subtable = (const AlternateSubstitutionSubtable *) lookupSubtable;
++ const LEReferenceTo<AlternateSubstitutionSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fFilter);
++ delta = subtable->process(subtable, glyphIterator, success, fFilter);
+ break;
+ }
+
+ case gsstLigature:
+ {
+- const LigatureSubstitutionSubtable *subtable = (const LigatureSubstitutionSubtable *) lookupSubtable;
++ const LEReferenceTo<LigatureSubstitutionSubtable> subtable(lookupSubtable, success);
+
+- delta = subtable->process(glyphIterator, fFilter);
++ delta = subtable->process(subtable, glyphIterator, success, fFilter);
+ break;
+ }
+
+ case gsstContext:
+ {
+- const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable;
++ const LEReferenceTo<ContextualSubstitutionSubtable> subtable(lookupSubtable, success);
+
+ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+@@ -129,7 +129,7 @@
+
+ case gsstChainingContext:
+ {
+- const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable;
++ const LEReferenceTo<ChainingContextualSubstitutionSubtable> subtable(lookupSubtable, success);
+
+ delta = subtable->process(this, glyphIterator, fontInstance, success);
+ break;
+@@ -137,7 +137,7 @@
+
+ case gsstExtension:
+ {
+- const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable;
++ const LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success);
+
+ delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success);
+ break;
+diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.h b/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
+--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h
+@@ -52,7 +52,7 @@
+ class GlyphSubstitutionLookupProcessor : public LookupProcessor
+ {
+ public:
+- GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader,
++ GlyphSubstitutionLookupProcessor(const LEReferenceTo<GlyphSubstitutionTableHeader> &glyphSubstitutionTableHeader,
+ LETag scriptTag,
+ LETag languageTag,
+ const LEGlyphFilter *filter,
+@@ -63,7 +63,7 @@
+
+ virtual ~GlyphSubstitutionLookupProcessor();
+
+- virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator,
++ virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+ protected:
+diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp b/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
+--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp
+@@ -42,11 +42,12 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage,
++le_int32 GlyphSubstitutionTableHeader::process(const LEReferenceTo<GlyphSubstitutionTableHeader> &base,
++ LEGlyphStorage &glyphStorage,
+ le_bool rightToLeft,
+ LETag scriptTag,
+ LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader,
+ const LEGlyphFilter *filter,
+ const FeatureMap *featureMap,
+ le_int32 featureMapCount,
+@@ -57,7 +58,7 @@
+ return 0;
+ }
+
+- GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success);
++ GlyphSubstitutionLookupProcessor processor(base, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success);
+ return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL, success);
+ }
+
+diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.h b/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
+--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h
+@@ -50,11 +50,12 @@
+
+ struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader
+ {
+- le_int32 process(LEGlyphStorage &glyphStorage,
++ le_int32 process(const LEReferenceTo<GlyphSubstitutionTableHeader> &base,
++ LEGlyphStorage &glyphStorage,
+ le_bool rightToLeft,
+ LETag scriptTag,
+ LETag languageTag,
+- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader,
+ const LEGlyphFilter *filter,
+ const FeatureMap *featureMap,
+ le_int32 featureMapCount,
+diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.cpp b/src/share/native/sun/font/layout/HanLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp
+@@ -64,7 +64,7 @@
+ #define features (loclFeatureMask)
+
+ HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = featureMap;
+diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.h b/src/share/native/sun/font/layout/HanLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.h
+@@ -73,7 +73,7 @@
+ * @internal
+ */
+ HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTablem, LEErrorCode &success);
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTablem, LEErrorCode &success);
+
+
+ /**
+diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.cpp b/src/share/native/sun/font/layout/HangulLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/HangulLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.cpp
+@@ -209,7 +209,7 @@
+ }
+
+ HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = featureMap;
+diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.h b/src/share/native/sun/font/layout/HangulLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/HangulLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.h
+@@ -79,7 +79,7 @@
+ * @internal
+ */
+ HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+diff --git a/src/share/native/sun/font/layout/ICUFeatures.h b/src/share/native/sun/font/layout/ICUFeatures.h
+--- jdk/src/share/native/sun/font/layout/ICUFeatures.h
++++ jdk/src/share/native/sun/font/layout/ICUFeatures.h
+@@ -54,16 +54,21 @@
+ le_uint16 lookupCount;
+ le_uint16 lookupListIndexArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(FeatureTable, lookupListIndexArray)
+
+ struct FeatureListTable
+ {
+ le_uint16 featureCount;
+ FeatureRecord featureRecordArray[ANY_NUMBER];
+
+- const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const;
++ LEReferenceTo<FeatureTable> getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const;
+
+- const FeatureTable *getFeatureTable(LETag featureTag) const;
++#if 0
++ const LEReferenceTo<FeatureTable> getFeatureTable(const LETableReference &base, LETag featureTag, LEErrorCode &success) const;
++#endif
+ };
+
++LE_VAR_ARRAY(FeatureListTable, featureRecordArray)
++
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp
+@@ -50,7 +50,7 @@
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine)
+
+ IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL)
+ {
+ if ( version2 ) {
+diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.h b/src/share/native/sun/font/layout/IndicLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h
+@@ -81,7 +81,7 @@
+ * @internal
+ */
+ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++ le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp b/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp
+@@ -43,11 +43,14 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor)
+
+-IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : StateTableProcessor(morphSubtableHeader)
++ IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : StateTableProcessor(morphSubtableHeader, success),
++ indicRearrangementSubtableHeader(morphSubtableHeader, success),
++ entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader),
++ entryTableOffset, LE_UNBOUNDED_ARRAY),
++ int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY)
++
+ {
+- indicRearrangementSubtableHeader = (const IndicRearrangementSubtableHeader *) morphSubtableHeader;
+- entryTable = (const IndicRearrangementStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset);
+ }
+
+ IndicRearrangementProcessor::~IndicRearrangementProcessor()
+@@ -62,7 +65,8 @@
+
+ ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
+ {
+- const IndicRearrangementStateEntry *entry = &entryTable[index];
++ LEErrorCode success = LE_NO_ERROR; // todo- make a param?
++ const IndicRearrangementStateEntry *entry = entryTable.getAlias(index,success);
+ ByteOffset newState = SWAPW(entry->newStateOffset);
+ IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
+
+diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.h b/src/share/native/sun/font/layout/IndicRearrangementProcessor.h
+--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h
++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h
+@@ -58,7 +58,7 @@
+
+ void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const;
+
+- IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+ virtual ~IndicRearrangementProcessor();
+
+ /**
+@@ -79,8 +79,9 @@
+ le_int32 firstGlyph;
+ le_int32 lastGlyph;
+
+- const IndicRearrangementStateEntry *entryTable;
+- const IndicRearrangementSubtableHeader *indicRearrangementSubtableHeader;
++ LEReferenceTo<IndicRearrangementSubtableHeader> indicRearrangementSubtableHeader;
++ LEReferenceToArrayOf<IndicRearrangementStateEntry> entryTable;
++ LEReferenceToArrayOf<le_int16> int16Table;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/IndicReordering.cpp b/src/share/native/sun/font/layout/IndicReordering.cpp
+--- jdk/src/share/native/sun/font/layout/IndicReordering.cpp
++++ jdk/src/share/native/sun/font/layout/IndicReordering.cpp
+@@ -658,6 +658,11 @@
+ MPreFixups *mpreFixups = NULL;
+ const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode);
+
++ if(classTable==NULL) {
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
++
+ if (classTable->scriptFlags & SF_MPRE_FIXUP) {
+ mpreFixups = new MPreFixups(charCount);
+ if (mpreFixups == NULL) {
+diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp
+--- jdk/src/share/native/sun/font/layout/KernTable.cpp
++++ jdk/src/share/native/sun/font/layout/KernTable.cpp
+@@ -92,16 +92,16 @@
+ * TODO: support multiple subtables
+ * TODO: respect header flags
+ */
+-KernTable::KernTable(const LEFontInstance* font_, const void* tableData)
+- : pairs(0), font(font_)
++KernTable::KernTable(const LETableReference &table, LEErrorCode &success)
++ : pairs(table, success), pairsSwapped(NULL), fTable(table)
+ {
+- const KernTableHeader* header = (const KernTableHeader*)tableData;
+- if (header == 0) {
++ if(LE_FAILURE(success) || (fTable.isEmpty())) {
+ #if DEBUG
+ fprintf(stderr, "no kern data\n");
+ #endif
+ return;
+ }
++ LEReferenceTo<KernTableHeader> header(fTable, success);
+
+ #if DEBUG
+ // dump first 32 bytes of header
+@@ -115,12 +115,17 @@
+ }
+ #endif
+
+- if (header->version == 0 && SWAPW(header->nTables) > 0) {
+- const SubtableHeader* subhead = (const SubtableHeader*)((char*)tableData + KERN_TABLE_HEADER_SIZE);
+- if (subhead->version == 0) {
++ if(LE_FAILURE(success)) return;
++
++ if (!header.isEmpty() && header->version == 0 && SWAPW(header->nTables) > 0) {
++ LEReferenceTo<SubtableHeader> subhead(header, success, KERN_TABLE_HEADER_SIZE);
++
++ if (LE_SUCCESS(success) && !subhead.isEmpty() && subhead->version == 0) {
+ coverage = SWAPW(subhead->coverage);
+ if (coverage & COVERAGE_HORIZONTAL) { // only handle horizontal kerning
+- const Subtable_0* table = (const Subtable_0*)((char*)subhead + KERN_SUBTABLE_HEADER_SIZE);
++ LEReferenceTo<Subtable_0> table(subhead, success, KERN_SUBTABLE_HEADER_SIZE);
++
++ if(table.isEmpty() || LE_FAILURE(success)) return;
+
+ nPairs = SWAPW(table->nPairs);
+
+@@ -134,17 +139,17 @@
+ rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange;
+ #endif
+
+- pairs = (PairInfo*)font->getKernPairs();
+- if (pairs == NULL) {
+- char *pairData = (char*)table + KERN_SUBTABLE_0_HEADER_SIZE;
+- char *pptr = pairData;
+- pairs = (PairInfo*)(malloc(nPairs*sizeof(PairInfo)));
+- PairInfo *p = (PairInfo*)pairs;
+- for (int i = 0; i < nPairs; i++, pptr += KERN_PAIRINFO_SIZE, p++) {
+- memcpy(p, pptr, KERN_PAIRINFO_SIZE);
++ if(LE_SUCCESS(success) && nPairs>0) {
++ pairs.setToOffsetInParent(table, KERN_SUBTABLE_0_HEADER_SIZE, nPairs, success);
++ }
++ if (LE_SUCCESS(success) && pairs.isValid()) {
++ pairsSwapped = (PairInfo*)(malloc(nPairs*sizeof(PairInfo)));
++ PairInfo *p = (PairInfo*)pairsSwapped;
++ for (int i = 0; LE_SUCCESS(success) && i < nPairs; i++, p++) {
++ memcpy(p, pairs.getAlias(i,success), KERN_PAIRINFO_SIZE);
+ p->key = SWAPL(p->key);
+ }
+- font->setKernPairs((void*)pairs);
++ fTable.getFont()->setKernPairs((void*)pairsSwapped); // store it
+ }
+
+ #if DEBUG
+@@ -162,7 +167,7 @@
+ ids[id] = (char)i;
+ }
+ }
+- PairInfo *p = pairs;
++ PairInfo* p = pairs;
+ for (int i = 0; i < nPairs; ++i, p++) {
+ le_uint32 k = p->key;
+ le_uint16 left = (k >> 16) & 0xffff;
+@@ -194,10 +199,12 @@
+ * Process the glyph positions. The positions array has two floats for each
+ * glyph, plus a trailing pair to mark the end of the last glyph.
+ */
+-void KernTable::process(LEGlyphStorage& storage)
++void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success)
+ {
+- if (pairs) {
+- LEErrorCode success = LE_NO_ERROR;
++ if(LE_FAILURE(success)) return;
++
++ if (pairsSwapped) {
++ success = LE_NO_ERROR;
+
+ le_uint32 key = storage[0]; // no need to mask off high bits
+ float adjust = 0;
+@@ -209,7 +216,7 @@
+ // so either I have to swap the element each time I examine it, or I have to swap
+ // all the elements ahead of time and store them in the font
+
+- const PairInfo* p = pairs;
++ const PairInfo* p = pairsSwapped;
+ const PairInfo* tp = (const PairInfo*)(p + rangeShift);
+ if (key > tp->key) {
+ p = tp;
+@@ -225,7 +232,7 @@
+ tp = (const PairInfo*)(p + probe);
+ le_uint32 tkey = tp->key;
+ #if DEBUG
+- fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairs), tkey);
++ fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey);
+ #endif
+ if (tkey <= key) {
+ if (tkey == key) {
+@@ -240,10 +247,10 @@
+ // device transform, or a faster way, such as moving the
+ // entire kern table up to Java.
+ LEPoint pt;
+- pt.fX = font->xUnitsToPoints(value);
++ pt.fX = fTable.getFont()->xUnitsToPoints(value);
+ pt.fY = 0;
+
+- font->getKerningAdjustment(pt);
++ fTable.getFont()->getKerningAdjustment(pt);
+ adjust += pt.fX;
+ break;
+ }
+diff --git a/src/share/native/sun/font/layout/KernTable.h b/src/share/native/sun/font/layout/KernTable.h
+--- jdk/src/share/native/sun/font/layout/KernTable.h
++++ jdk/src/share/native/sun/font/layout/KernTable.h
+@@ -26,7 +26,7 @@
+ /*
+ *
+ *
+- * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 2004-2013 - All Rights Reserved
+ *
+ */
+
+@@ -38,6 +38,7 @@
+ #endif
+
+ #include "LETypes.h"
++#include "LETableReference.h"
+ //#include "LEFontInstance.h"
+ //#include "LEGlyphStorage.h"
+
+@@ -56,19 +57,20 @@
+ private:
+ le_uint16 coverage;
+ le_uint16 nPairs;
+- const PairInfo* pairs;
+- const LEFontInstance* font;
++ LEReferenceToArrayOf<PairInfo> pairs;
++ PairInfo *pairsSwapped;
++ const LETableReference &fTable;
+ le_uint16 searchRange;
+ le_uint16 entrySelector;
+ le_uint16 rangeShift;
+
+ public:
+- KernTable(const LEFontInstance* font, const void* tableData);
++ KernTable(const LETableReference &table, LEErrorCode &success);
+
+ /*
+ * Process the glyph positions.
+ */
+- void process(LEGlyphStorage& storage);
++ void process(LEGlyphStorage& storage, LEErrorCode &success);
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp b/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp
+@@ -43,7 +43,7 @@
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine)
+
+ KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount);
+diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.h b/src/share/native/sun/font/layout/KhmerLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h
+@@ -83,7 +83,7 @@
+ * @internal
+ */
+ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+diff --git a/src/share/native/sun/font/layout/LEFontInstance.h b/src/share/native/sun/font/layout/LEFontInstance.h
+--- jdk/src/share/native/sun/font/layout/LEFontInstance.h
++++ jdk/src/share/native/sun/font/layout/LEFontInstance.h
+@@ -194,6 +194,25 @@
+ virtual void setKernPairs(void *pairs) const = 0;
+
+ /**
++ * This method reads a table from the font. Note that in general,
++ * it only makes sense to call this method on an <code>LEFontInstance</code>
++ * which represents a physical font - i.e. one which has been returned by
++ * <code>getSubFont()</code>. This is because each subfont in a composite font
++ * will have different tables, and there's no way to know which subfont to access.
++ *
++ * Subclasses which represent composite fonts should always return <code>NULL</code>.
++ *
++ * This version sets a length, for range checking.
++ *
++ * @param tableTag - the four byte table tag. (e.g. 'cmap')
++ * @param length - ignored on entry, on exit will be the length of the table if known, or -1 if unknown.
++ * @return the address of the table in memory, or <code>NULL</code>
++ * if the table doesn't exist.
++ * @internal
++ */
++ virtual const void* getFontTable(LETag tableTag, size_t &length) const { length=-1; return getFontTable(tableTag); } /* -1 = unknown length */
++
++ /**
+ * This method is used to determine if the font can
+ * render the given character. This can usually be done
+ * by looking the character up in the font's character
+diff --git a/src/share/native/sun/font/layout/LEScripts.h b/src/share/native/sun/font/layout/LEScripts.h
+--- jdk/src/share/native/sun/font/layout/LEScripts.h
++++ jdk/src/share/native/sun/font/layout/LEScripts.h
+@@ -241,8 +241,28 @@
+ palmScriptCode = 144,
+ sindScriptCode = 145,
+ waraScriptCode = 146,
++/**
++ * @stable ICU 4.8
++ */
+
+- scriptCodeCount = 147
++ afakScriptCode = 147,
++ jurcScriptCode = 148,
++ mrooScriptCode = 149,
++ nshuScriptCode = 150,
++ shrdScriptCode = 151,
++ soraScriptCode = 152,
++ takrScriptCode = 153,
++ tangScriptCode = 154,
++ woleScriptCode = 155,
++/**
++ * @stable ICU 49
++ */
++
++ hluwScriptCode = 156, /* bump to match current ICU */
++ khojScriptCode = 157,
++ tirhScriptCode = 158,
++
++ scriptCodeCount = 159
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/LETableReference.h b/src/share/native/sun/font/layout/LETableReference.h
+new file mode 100644
+--- /dev/null
++++ jdk/src/share/native/sun/font/layout/LETableReference.h
+@@ -0,0 +1,497 @@
++/*
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/*
++ * -*- c++ -*-
++ *
++ * (C) Copyright IBM Corp. and others 2013 - All Rights Reserved
++ *
++ * Range checking
++ *
++ */
++
++#ifndef __LETABLEREFERENCE_H
++#define __LETABLEREFERENCE_H
++
++#include "LETypes.h"
++#include "LEFontInstance.h"
++
++
++#define kQuestionmarkTableTag 0x3F3F3F3FUL
++#define kTildeTableTag 0x7e7e7e7eUL
++#ifdef __cplusplus
++
++// internal - interface for range checking
++U_NAMESPACE_BEGIN
++
++#if LE_ASSERT_BAD_FONT
++class LETableReference; // fwd
++/**
++ * defined in OpenTypeUtilities.cpp
++ * @internal
++ */
++U_INTERNAL void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len);
++
++#define LE_DEBUG_TR(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0);
++#define LE_DEBUG_TR3(x,y,z) _debug_LETableReference(__FILE__, __LINE__, x, this, (const void*)y, (size_t)z);
++#if 0
++#define LE_TRACE_TR(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0);
++#else
++#define LE_TRACE_TR(x)
++#endif
++
++#else
++#define LE_DEBUG_TR(x)
++#define LE_DEBUG_TR3(x,y,z)
++#define LE_TRACE_TR(x)
++#endif
++
++/**
++ * @internal
++ */
++class LETableReference {
++public:
++/**
++ * @internal
++ * Construct from a specific tag
++ */
++ LETableReference(const LEFontInstance* font, LETag tableTag, LEErrorCode &success) :
++ fFont(font), fTag(tableTag), fParent(NULL), fStart(NULL),fLength(LE_UINTPTR_MAX) {
++ loadTable(success);
++ LE_TRACE_TR("INFO: new table load")
++ }
++
++ LETableReference(const LETableReference &parent, LEErrorCode &success) : fFont(parent.fFont), fTag(parent.fTag), fParent(&parent), fStart(parent.fStart), fLength(parent.fLength) {
++ if(LE_FAILURE(success)) {
++ clear();
++ }
++ LE_TRACE_TR("INFO: new clone")
++ }
++
++ LETableReference(const le_uint8* data, size_t length = LE_UINTPTR_MAX) :
++ fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(data), fLength(length) {
++ LE_TRACE_TR("INFO: new raw")
++ }
++ LETableReference() :
++ fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(NULL), fLength(0) {
++ LE_TRACE_TR("INFO: new empty")
++ }
++
++ ~LETableReference() {
++ fTag=kTildeTableTag;
++ LE_TRACE_TR("INFO: new dtor")
++ }
++
++ /**
++ * @internal
++ * @param length if LE_UINTPTR_MAX means "whole table"
++ * subset
++ */
++ LETableReference(const LETableReference &parent, size_t offset, size_t length,
++ LEErrorCode &err) :
++ fFont(parent.fFont), fTag(parent.fTag), fParent(&parent),
++ fStart((parent.fStart)+offset), fLength(length) {
++ if(LE_SUCCESS(err)) {
++ if(isEmpty()) {
++ //err = LE_MISSING_FONT_TABLE_ERROR;
++ clear(); // it's just empty. Not an error.
++ } else if(offset >= fParent->fLength) {
++ LE_DEBUG_TR3("offset out of range: (%p) +%d", NULL, offset);
++ err = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ clear();
++ } else {
++ if(fLength == LE_UINTPTR_MAX &&
++ fParent->fLength != LE_UINTPTR_MAX) {
++ fLength = (fParent->fLength) - offset; // decrement length as base address is incremented
++ }
++ if(fLength != LE_UINTPTR_MAX) { // if we have bounds:
++ if(offset+fLength > fParent->fLength) {
++ LE_DEBUG_TR3("offset+fLength out of range: (%p) +%d", NULL, offset+fLength);
++ err = LE_INDEX_OUT_OF_BOUNDS_ERROR; // exceeded
++ clear();
++ }
++ }
++ }
++ } else {
++ clear();
++ }
++ LE_TRACE_TR("INFO: new subset")
++ }
++
++ const void* getAlias() const { return (const void*)fStart; }
++ const void* getAliasTODO() const { LE_DEBUG_TR("getAliasTODO()"); return (const void*)fStart; }
++ le_bool isEmpty() const { return fStart==NULL || fLength==0; }
++ le_bool isValid() const { return !isEmpty(); }
++ le_bool hasBounds() const { return fLength!=LE_UINTPTR_MAX; }
++ void clear() { fLength=0; fStart=NULL; }
++ size_t getLength() const { return fLength; }
++ const LEFontInstance* getFont() const { return fFont; }
++ LETag getTag() const { return fTag; }
++ const LETableReference* getParent() const { return fParent; }
++
++ void addOffset(size_t offset, LEErrorCode &success) {
++ if(hasBounds()) {
++ if(offset > fLength) {
++ LE_DEBUG_TR("addOffset off end");
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ return;
++ } else {
++ fLength -= offset;
++ }
++ }
++ fStart += offset;
++ }
++
++ size_t ptrToOffset(const void *atPtr, LEErrorCode &success) const {
++ if(atPtr==NULL) return 0;
++ if(LE_FAILURE(success)) return LE_UINTPTR_MAX;
++ if((atPtr < fStart) ||
++ (hasBounds() && (atPtr > fStart+fLength))) {
++ LE_DEBUG_TR3("ptrToOffset args out of range: %p", atPtr, 0);
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ return LE_UINTPTR_MAX;
++ }
++ return ((const le_uint8*)atPtr)-fStart;
++ }
++
++ /**
++ * Clamp down the length, for range checking.
++ */
++ size_t contractLength(size_t newLength) {
++ if(fLength!=LE_UINTPTR_MAX&&newLength>0&&newLength<=fLength) {
++ fLength = newLength;
++ }
++ return fLength;
++ }
++
++ /**
++ * Throw an error if offset+length off end
++ */
++public:
++ size_t verifyLength(size_t offset, size_t length, LEErrorCode &success) {
++ if(isValid()&&
++ LE_SUCCESS(success) &&
++ fLength!=LE_UINTPTR_MAX && length!=LE_UINTPTR_MAX && offset!=LE_UINTPTR_MAX &&
++ (offset+length)>fLength) {
++ LE_DEBUG_TR3("verifyLength failed (%p) %d",NULL, offset+length);
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++#if LE_ASSERT_BAD_FONT
++ fprintf(stderr, "offset=%lu, len=%lu, would be at %p, (%lu) off end. End at %p\n", offset,length, fStart+offset+length, (offset+length-fLength), (offset+length-fLength)+fStart);
++#endif
++ }
++ return fLength;
++ }
++
++ le_bool isSubsetOf(const LETableReference& base) const {
++ if(this == &base) return true;
++ if(fStart < base.fStart) return false;
++ if(base.hasBounds()) {
++ if(fStart >= base.fStart + base.fLength) return false;
++ if(hasBounds()) {
++ if(fStart + fLength > base.fStart + base.fLength) return false;
++ }
++ }
++ return true;
++ }
++
++ /**
++ * Change parent link to another
++ */
++ LETableReference &reparent(const LETableReference &base) {
++ fParent = &base;
++ return *this;
++ }
++
++ /**
++ * remove parent link. Factory functions should do this.
++ */
++ void orphan(void) {
++ fParent=NULL;
++ }
++
++protected:
++ const LEFontInstance* fFont;
++ LETag fTag;
++ const LETableReference *fParent;
++ const le_uint8 *fStart; // keep as 8 bit internally, for pointer math
++ size_t fLength;
++
++ void loadTable(LEErrorCode &success) {
++ if(LE_SUCCESS(success)) {
++ fStart = (const le_uint8*)(fFont->getFontTable(fTag, fLength)); // note - a null table is not an error.
++ }
++ }
++
++ void setRaw(const void *data, size_t length = LE_UINTPTR_MAX) {
++ fFont = NULL;
++ fTag = kQuestionmarkTableTag;
++ fParent = NULL;
++ fStart = (const le_uint8*)data;
++ fLength = length;
++ }
++};
++
++
++template<class T>
++class LETableVarSizer {
++ public:
++ inline static size_t getSize();
++};
++
++// base definition- could override for adjustments
++template<class T> inline
++size_t LETableVarSizer<T>::getSize() {
++ return sizeof(T);
++}
++
++/**
++ * \def LE_VAR_ARRAY
++ * @param x Type (T)
++ * @param y some member that is of length ANY_NUMBER
++ * Call this after defining a class, for example:
++ * LE_VAR_ARRAY(FeatureListTable,featureRecordArray)
++ * this is roughly equivalent to:
++ * template<> inline size_t LETableVarSizer<FeatureListTable>::getSize() { return sizeof(FeatureListTable) - (sizeof(le_uint16)*ANY_NUMBER); }
++ * it's a specialization that informs the LETableReference subclasses to NOT include the variable array in the size.
++ * dereferencing NULL is valid here because we never actually dereference it, just inside sizeof.
++ */
++#define LE_VAR_ARRAY(x,y) template<> inline size_t LETableVarSizer<x>::getSize() { return sizeof(x) - (sizeof(((const x*)0)->y)); }
++
++/**
++ * Open a new entry based on an existing table
++ */
++
++/**
++ * \def LE_UNBOUNDED_ARRAY
++ * define an array with no *known* bound. Will trim to available size.
++ * @internal
++ */
++#define LE_UNBOUNDED_ARRAY LE_UINT32_MAX
++
++template<class T>
++class LEReferenceToArrayOf : public LETableReference {
++public:
++ LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, size_t offset, le_uint32 count)
++ : LETableReference(parent, offset, LE_UINTPTR_MAX, success), fCount(count) {
++ LE_TRACE_TR("INFO: new RTAO by offset")
++ if(LE_SUCCESS(success)) {
++ if(count == LE_UNBOUNDED_ARRAY) { // not a known length
++ count = getLength()/LETableVarSizer<T>::getSize(); // fit to max size
++ }
++ LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*count, success);
++ }
++ if(LE_FAILURE(success)) {
++ fCount=0;
++ clear();
++ }
++ }
++
++ LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, le_uint32 count)
++ : LETableReference(parent, parent.ptrToOffset(array, success), LE_UINTPTR_MAX, success), fCount(count) {
++LE_TRACE_TR("INFO: new RTAO")
++ if(LE_SUCCESS(success)) {
++ if(count == LE_UNBOUNDED_ARRAY) { // not a known length
++ count = getLength()/LETableVarSizer<T>::getSize(); // fit to max size
++ }
++ LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*count, success);
++ }
++ if(LE_FAILURE(success)) clear();
++ }
++ LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, size_t offset, le_uint32 count)
++ : LETableReference(parent, parent.ptrToOffset(array, success)+offset, LE_UINTPTR_MAX, success), fCount(count) {
++LE_TRACE_TR("INFO: new RTAO")
++ if(LE_SUCCESS(success)) {
++ if(count == LE_UNBOUNDED_ARRAY) { // not a known length
++ count = getLength()/LETableVarSizer<T>::getSize(); // fit to max size
++ }
++ LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*count, success);
++ }
++ if(LE_FAILURE(success)) clear();
++ }
++
++ LEReferenceToArrayOf() :LETableReference(), fCount(0) {}
++
++ le_uint32 getCount() const { return fCount; }
++
++ using LETableReference::getAlias;
++
++ const T *getAlias(le_uint32 i, LEErrorCode &success) const {
++ if(LE_SUCCESS(success)&& i<getCount()) {
++ return ((const T*)getAlias())+i;
++ } else {
++ if(LE_SUCCESS(success)) {
++ LE_DEBUG_TR("getAlias(subscript) out of range");
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ }
++ return ((const T*)getAlias()); // return first item, so there's no crash
++ }
++ }
++
++ const T *getAliasTODO() const { LE_DEBUG_TR("getAliasTODO<>"); return (const T*)fStart; }
++
++ const T& getObject(le_uint32 i, LEErrorCode &success) const {
++ return *getAlias(i,success);
++ }
++
++ const T& operator()(le_uint32 i, LEErrorCode &success) const {
++ return *getAlias(i,success);
++ }
++
++ size_t getOffsetFor(le_uint32 i, LEErrorCode &success) const {
++ if(LE_SUCCESS(success)&&i<getCount()) {
++ return LETableVarSizer<T>::getSize()*i;
++ } else {
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ }
++ return 0;
++ }
++
++ LEReferenceToArrayOf<T> &reparent(const LETableReference &base) {
++ fParent = &base;
++ return *this;
++ }
++
++ LEReferenceToArrayOf(const LETableReference& parent, LEErrorCode & success) : LETableReference(parent,0, LE_UINTPTR_MAX, success), fCount(0) {
++ LE_TRACE_TR("INFO: null RTAO")
++ }
++
++ /**
++ * set this to point within our fParent, but based on 'base' as a subtable.
++ */
++ void setToOffsetInParent(const LETableReference& base, size_t offset, le_uint32 count, LEErrorCode &success) {
++LE_TRACE_TR("INFO: sTOIP")
++ if(LE_FAILURE(success)) return;
++ if(!fParent->isSubsetOf(base)) { // Ensure that 'base' is containable within our parent.
++ clear(); // otherwise, it's not a subtable of our parent.
++ LE_DEBUG_TR("setToOffsetInParents called on non subsets");
++ success = LE_ILLEGAL_ARGUMENT_ERROR; return;
++ }
++ size_t baseOffset = fParent->ptrToOffset(((const le_uint8*)base.getAlias())+offset, success);
++ if(LE_FAILURE(success)) return; // base was outside of parent's range
++ if(fParent->hasBounds()) {
++ if((baseOffset >= fParent->getLength()) || // start off end of parent
++ (baseOffset+(count*LETableVarSizer<T>::getSize()) >= fParent->getLength()) || // or off end of parent
++ count > LE_UINTPTR_MAX/LETableVarSizer<T>::getSize()) { // or more than would fit in memory
++ LE_DEBUG_TR("setToOffsetInParent called with bad length");
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ clear();
++ return; // start would go off end of parent
++ }
++ }
++ fStart = (const le_uint8*)(fParent->getAlias()) + baseOffset;
++ //fLength = count*LETableVarSizer<T>::getSize(); - no- do not shrink fLength.
++ if(fParent->hasBounds()) {
++ fLength = (fParent->getLength() - (fStart-(const le_uint8*)fParent->getAlias())); // reduces fLength accordingly.
++ } else {
++ fLength = LE_UINTPTR_MAX; // unbounded
++ }
++ if((fStart < fParent->getAlias()) ||
++ (hasBounds()&&(fStart+fLength < fStart))) { // wrapped
++ LE_DEBUG_TR("setToOffsetInParent called with bad length");
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ clear();
++ return; // start would go off end of parent
++ }
++ fCount = count;
++ }
++
++private:
++ le_uint32 fCount;
++};
++
++
++template<class T>
++class LEReferenceTo : public LETableReference {
++public:
++ /**
++ * open a sub reference.
++ * @param parent parent reference
++ * @param success error status
++ * @param atPtr location of reference - if NULL, will be at offset zero (i.e. downcast of parent). Otherwise must be a pointer within parent's bounds.
++ */
++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr)
++ : LETableReference(parent, parent.ptrToOffset(atPtr, success), LE_UINTPTR_MAX, success) {
++ verifyLength(parent.ptrToOffset(atPtr,success), LETableVarSizer<T>::getSize(), success);
++ if(LE_FAILURE(success)) clear();
++ }
++ /**
++ * ptr plus offset
++ */
++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr, size_t offset)
++ : LETableReference(parent, parent.ptrToOffset(atPtr, success)+offset, LE_UINTPTR_MAX, success) {
++ verifyLength(0, LETableVarSizer<T>::getSize(), success);
++ if(LE_FAILURE(success)) clear();
++ }
++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success, size_t offset)
++ : LETableReference(parent, offset, LE_UINTPTR_MAX, success) {
++ verifyLength(0, LETableVarSizer<T>::getSize(), success);
++ if(LE_FAILURE(success)) clear();
++ }
++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success)
++ : LETableReference(parent, 0, LE_UINTPTR_MAX, success) {
++ verifyLength(0, LETableVarSizer<T>::getSize(), success);
++ if(LE_FAILURE(success)) clear();
++ }
++ LEReferenceTo(const LEFontInstance *font, LETag tableTag, LEErrorCode &success)
++ : LETableReference(font, tableTag, success) {
++ verifyLength(0, LETableVarSizer<T>::getSize(), success);
++ if(LE_FAILURE(success)) clear();
++ }
++ LEReferenceTo(const le_uint8 *data, size_t length = LE_UINTPTR_MAX) : LETableReference(data, length) {}
++ LEReferenceTo(const T *data, size_t length = LE_UINTPTR_MAX) : LETableReference((const le_uint8*)data, length) {}
++ LEReferenceTo() : LETableReference(NULL) {}
++
++ LEReferenceTo<T>& operator=(const T* other) {
++ setRaw(other);
++ return *this;
++ }
++
++ LEReferenceTo<T> &reparent(const LETableReference &base) {
++ fParent = &base;
++ return *this;
++ }
++
++ /**
++ * roll forward by one <T> size.
++ * same as addOffset(LETableVarSizer<T>::getSize(),success)
++ */
++ void addObject(LEErrorCode &success) {
++ addOffset(LETableVarSizer<T>::getSize(), success);
++ }
++ void addObject(size_t count, LEErrorCode &success) {
++ addOffset(LETableVarSizer<T>::getSize()*count, success);
++ }
++
++ const T *operator->() const { return getAlias(); }
++ const T *getAlias() const { return (const T*)fStart; }
++ const T *getAliasTODO() const { LE_DEBUG_TR("getAliasTODO<>"); return (const T*)fStart; }
++};
++
++
++U_NAMESPACE_END
++
++#endif
++
++#endif
+diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h
+--- jdk/src/share/native/sun/font/layout/LETypes.h
++++ jdk/src/share/native/sun/font/layout/LETypes.h
+@@ -245,12 +245,15 @@
+ /**
+ * Max value representable by a uintptr
+ */
++
++#ifndef UINT32_MAX
++#define LE_UINT32_MAX 0xFFFFFFFFU
++#else
++#define LE_UINT32_MAX UINT32_MAX
++#endif
++
+ #ifndef UINTPTR_MAX
+-#ifndef UINT32_MAX
+-#define LE_UINTPTR_MAX 0xFFFFFFFFU
+-#else
+-#define LE_UINTPTR_MAX UINT32_MAX
+-#endif
++#define LE_UINTPTR_MAX LE_UINT32_MAX
+ #else
+ #define LE_UINTPTR_MAX UINTPTR_MAX
+ #endif
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
+@@ -141,21 +141,21 @@
+ class CanonMarkFilter : public UMemory, public LEGlyphFilter
+ {
+ private:
+- const GlyphClassDefinitionTable *classDefTable;
++ const LEReferenceTo<GlyphClassDefinitionTable> classDefTable;
+
+ CanonMarkFilter(const CanonMarkFilter &other); // forbid copying of this class
+ CanonMarkFilter &operator=(const CanonMarkFilter &other); // forbid copying of this class
+
+ public:
+- CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable);
++ CanonMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success);
+ virtual ~CanonMarkFilter();
+
+ virtual le_bool accept(LEGlyphID glyph) const;
+ };
+
+-CanonMarkFilter::CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable)
++CanonMarkFilter::CanonMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success)
++ : classDefTable(gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success))
+ {
+- classDefTable = gdefTable->getMarkAttachClassDefinitionTable();
+ }
+
+ CanonMarkFilter::~CanonMarkFilter()
+@@ -165,9 +165,10 @@
+
+ le_bool CanonMarkFilter::accept(LEGlyphID glyph) const
+ {
+- le_int32 glyphClass = classDefTable->getGlyphClass(glyph);
+-
+- return glyphClass != 0;
++ LEErrorCode success = LE_NO_ERROR;
++ le_int32 glyphClass = classDefTable->getGlyphClass(classDefTable, glyph, success);
++ if(LE_FAILURE(success)) return false;
++ return glyphClass != 0;
+ }
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine)
+@@ -252,20 +253,20 @@
+ return 0;
+ }
+
+- const GlyphSubstitutionTableHeader *canonGSUBTable = (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
++ LEReferenceTo<GlyphSubstitutionTableHeader> canonGSUBTable((GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable);
+ LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode);
+ LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode);
+ le_int32 i, dir = 1, out = 0, outCharCount = count;
+
+- if (canonGSUBTable->coversScript(scriptTag)) {
++ if (canonGSUBTable->coversScript(canonGSUBTable,scriptTag, success) || LE_SUCCESS(success)) {
+ CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance);
+ if (substitutionFilter == NULL) {
+ success = LE_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+
+- const LEUnicode *inChars = &chars[offset];
+- LEUnicode *reordered = NULL;
++ const LEUnicode *inChars = &chars[offset];
++ LEUnicode *reordered = NULL;
+ LEGlyphStorage fakeGlyphStorage;
+
+ fakeGlyphStorage.allocateGlyphArray(count, rightToLeft, success);
+@@ -275,20 +276,20 @@
+ return 0;
+ }
+
+- // This is the cheapest way to get mark reordering only for Hebrew.
+- // We could just do the mark reordering for all scripts, but most
+- // of them probably don't need it...
+- if (fScriptCode == hebrScriptCode) {
+- reordered = LE_NEW_ARRAY(LEUnicode, count);
++ // This is the cheapest way to get mark reordering only for Hebrew.
++ // We could just do the mark reordering for all scripts, but most
++ // of them probably don't need it...
++ if (fScriptCode == hebrScriptCode) {
++ reordered = LE_NEW_ARRAY(LEUnicode, count);
+
+- if (reordered == NULL) {
+- delete substitutionFilter;
+- success = LE_MEMORY_ALLOCATION_ERROR;
+- return 0;
+- }
++ if (reordered == NULL) {
++ delete substitutionFilter;
++ success = LE_MEMORY_ALLOCATION_ERROR;
++ return 0;
++ }
+
+- CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage);
+- inChars = reordered;
++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage);
++ inChars = reordered;
+ }
+
+ fakeGlyphStorage.allocateAuxData(success);
+@@ -308,11 +309,11 @@
+ fakeGlyphStorage.setAuxData(out, canonFeatures, success);
+ }
+
+- if (reordered != NULL) {
+- LE_DELETE_ARRAY(reordered);
+- }
++ if (reordered != NULL) {
++ LE_DELETE_ARRAY(reordered);
++ }
+
+- outCharCount = canonGSUBTable->process(fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success);
++ outCharCount = canonGSUBTable->process(canonGSUBTable, fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, (const GlyphDefinitionTableHeader*)NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success);
+
+ if (LE_FAILURE(success)) {
+ delete substitutionFilter;
+@@ -413,16 +414,16 @@
+ return;
+ }
+
+- GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+- CanonMarkFilter filter(gdefTable);
++ LEReferenceTo<GlyphDefinitionTableHeader> gdefTable((GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable,
++ CanonShaping::glyphDefinitionTableLen);
++ CanonMarkFilter filter(gdefTable, success);
+
+ adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+
+ if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */
+- static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
+-
+- KernTable kt(fFontInstance, getFontTable(kernTableTag));
+- kt.process(glyphStorage);
++ LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success);
++ KernTable kt(kernTable, success);
++ kt.process(glyphStorage, success);
+ }
+
+ // default is no adjustments
+@@ -507,9 +508,9 @@
+ glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success);
+ }
+
+-const void *LayoutEngine::getFontTable(LETag tableTag) const
++const void *LayoutEngine::getFontTable(LETag tableTag, size_t &length) const
+ {
+- return fFontInstance->getFontTable(tableTag);
++ return fFontInstance->getFontTable(tableTag, length);
+ }
+
+ void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror,
+@@ -556,7 +557,10 @@
+
+ void LayoutEngine::reset()
+ {
++ if(fGlyphStorage!=NULL) {
+ fGlyphStorage->reset();
++ fGlyphStorage = NULL;
++ }
+ }
+
+ LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success)
+@@ -574,19 +578,19 @@
+ return NULL;
+ }
+
+- const GlyphSubstitutionTableHeader *gsubTable = (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag);
++ LEReferenceTo<GlyphSubstitutionTableHeader> gsubTable(fontInstance,gsubTableTag,success);
+ LayoutEngine *result = NULL;
+ LETag scriptTag = 0x00000000;
+ LETag languageTag = 0x00000000;
+- LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode);
++ LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode);
+
+ // Right now, only invoke V2 processing for Devanagari. TODO: Allow more V2 scripts as they are
+ // properly tested.
+
+- if ( v2ScriptTag == dev2ScriptTag && gsubTable != NULL && gsubTable->coversScript( v2ScriptTag )) {
+- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success);
+- }
+- else if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
++ if ( v2ScriptTag == dev2ScriptTag && gsubTable.isValid() && gsubTable->coversScript(gsubTable, v2ScriptTag, success )) {
++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success);
++ }
++ else if (gsubTable.isValid() && gsubTable->coversScript(gsubTable, scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode), success)) {
+ switch (scriptCode) {
+ case bengScriptCode:
+ case devaScriptCode:
+@@ -617,10 +621,10 @@
+ case janLanguageCode:
+ case zhtLanguageCode:
+ case zhsLanguageCode:
+- if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) {
++ if (gsubTable->coversScriptAndLanguage(gsubTable, scriptTag, languageTag, success, TRUE)) {
+ result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+- }
++ }
+
+ // note: falling through to default case.
+ default:
+@@ -643,10 +647,10 @@
+ break;
+ }
+ } else {
+- const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag);
++ LEReferenceTo<MorphTableHeader> mortTable(fontInstance, mortTableTag, success);
+
+- if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) {
+- result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable, success);
++ if (LE_SUCCESS(success) && mortTable.isValid() && SWAPL(mortTable->version)==0x00010000) { // mort
++ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, mortTable, success);
+ } else {
+ switch (scriptCode) {
+ case bengScriptCode:
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.h b/src/share/native/sun/font/layout/LayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.h
+@@ -268,12 +268,18 @@
+ * some other way must override this method.
+ *
+ * @param tableTag - the four byte table tag.
++ * @param length - length to use
+ *
+ * @return the address of the table.
+ *
+ * @internal
+ */
+- virtual const void *getFontTable(LETag tableTag) const;
++ virtual const void *getFontTable(LETag tableTag, size_t &length) const;
++
++ /**
++ * @deprecated
++ */
++ virtual const void *getFontTable(LETag tableTag) const { size_t ignored; return getFontTable(tableTag, ignored); }
+
+ /**
+ * This method does character to glyph mapping. The default implementation
+diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.cpp b/src/share/native/sun/font/layout/LigatureSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp
+@@ -47,15 +47,15 @@
+
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor)
+
+-LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : StateTableProcessor(morphSubtableHeader)
++ LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++: StateTableProcessor(morphSubtableHeader, success), ligatureSubstitutionHeader(morphSubtableHeader, success)
+ {
+- ligatureSubstitutionHeader = (const LigatureSubstitutionHeader *) morphSubtableHeader;
++ if(LE_FAILURE(success)) return;
+ ligatureActionTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureActionTableOffset);
+ componentTableOffset = SWAPW(ligatureSubstitutionHeader->componentTableOffset);
+ ligatureTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureTableOffset);
+
+- entryTable = (const LigatureSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset);
++ entryTable = LEReferenceToArrayOf<LigatureSubstitutionStateEntry>(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY);
+ }
+
+ LigatureSubstitutionProcessor::~LigatureSubstitutionProcessor()
+@@ -69,7 +69,9 @@
+
+ ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
+ {
+- const LigatureSubstitutionStateEntry *entry = &entryTable[index];
++ LEErrorCode success = LE_NO_ERROR;
++ const LigatureSubstitutionStateEntry *entry = entryTable.getAlias(index, success);
++
+ ByteOffset newState = SWAPW(entry->newStateOffset);
+ le_int16 flags = SWAPW(entry->flags);
+
+@@ -88,7 +90,7 @@
+ ByteOffset actionOffset = flags & lsfActionOffsetMask;
+
+ if (actionOffset != 0) {
+- const LigatureActionEntry *ap = (const LigatureActionEntry *) ((char *) &ligatureSubstitutionHeader->stHeader + actionOffset);
++ LEReferenceTo<LigatureActionEntry> ap(stHeader, success, actionOffset);
+ LigatureActionEntry action;
+ le_int32 offset, i = 0;
+ le_int32 stack[nComponents];
+@@ -97,7 +99,8 @@
+ do {
+ le_uint32 componentGlyph = componentStack[m--];
+
+- action = SWAPL(*ap++);
++ action = SWAPL(*ap.getAlias());
++ ap.addObject(success); // ap++
+
+ if (m < 0) {
+ m = nComponents - 1;
+@@ -105,37 +108,33 @@
+
+ offset = action & lafComponentOffsetMask;
+ if (offset != 0) {
+- const le_int16 *offsetTable = (const le_int16 *)((char *) &ligatureSubstitutionHeader->stHeader + 2 * SignExtend(offset, lafComponentOffsetMask));
+- const le_int16 *tableEnd = (const le_int16 *)((char *) &ligatureSubstitutionHeader + 1 * SWAPW(ligatureSubstitutionHeader->length));
++ LEReferenceToArrayOf<le_int16> offsetTable(stHeader, success, 2 * SignExtend(offset, lafComponentOffsetMask), LE_UNBOUNDED_ARRAY);
+
+- // Check if the font is internally consistent
+- if(tableEnd < (const le_int16*)&ligatureSubstitutionHeader // stated end wrapped around?
+- || offsetTable > tableEnd) { // offset past end of stated length?
++ if(LE_FAILURE(success)) {
+ currGlyph++;
+ LE_DEBUG_BAD_FONT("off end of ligature substitution header");
+ return newState; // get out! bad font
+- }
+-
+- if(componentGlyph > glyphStorage.getGlyphCount()) {
+- LE_DEBUG_BAD_FONT("preposterous componentGlyph");
+- currGlyph++;
+- return newState; // get out! bad font
+- }
+- i += SWAPW(offsetTable[LE_GET_GLYPH(glyphStorage[componentGlyph])]);
++ }
++ if(componentGlyph > glyphStorage.getGlyphCount()) {
++ LE_DEBUG_BAD_FONT("preposterous componentGlyph");
++ currGlyph++;
++ return newState; // get out! bad font
++ }
++ i += SWAPW(offsetTable.getObject(LE_GET_GLYPH(glyphStorage[componentGlyph]), success));
+
+ if (action & (lafLast | lafStore)) {
+- const TTGlyphID *ligatureOffset = (const TTGlyphID *) ((char *) &ligatureSubstitutionHeader->stHeader + i);
+- TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset);
++ LEReferenceTo<TTGlyphID> ligatureOffset(stHeader, success, i);
++ TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset.getAlias());
+
+- glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph);
+- if(mm==nComponents) {
+- LE_DEBUG_BAD_FONT("exceeded nComponents");
+- mm--; // don't overrun the stack.
+- }
+- stack[++mm] = componentGlyph;
+- i = 0;
++ glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph);
++ if(mm==nComponents) {
++ LE_DEBUG_BAD_FONT("exceeded nComponents");
++ mm--; // don't overrun the stack.
++ }
++ stack[++mm] = componentGlyph;
++ i = 0;
+ } else {
+- glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF);
++ glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF);
+ }
+ }
+ #if LE_ASSERT_BAD_FONT
+@@ -146,11 +145,11 @@
+ } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
+
+ while (mm >= 0) {
+- if (++m >= nComponents) {
+- m = 0;
+- }
++ if (++m >= nComponents) {
++ m = 0;
++ }
+
+- componentStack[m] = stack[mm--];
++ componentStack[m] = stack[mm--];
+ }
+ }
+
+diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.h b/src/share/native/sun/font/layout/LigatureSubstProc.h
+--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.h
++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.h
+@@ -58,7 +58,7 @@
+
+ virtual void endStateTable();
+
+- LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ LigatureSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+ virtual ~LigatureSubstitutionProcessor();
+
+ /**
+@@ -83,12 +83,12 @@
+ ByteOffset componentTableOffset;
+ ByteOffset ligatureTableOffset;
+
+- const LigatureSubstitutionStateEntry *entryTable;
++ LEReferenceToArrayOf<LigatureSubstitutionStateEntry> entryTable;
+
+ le_int32 componentStack[nComponents];
+ le_int16 m;
+
+- const LigatureSubstitutionHeader *ligatureSubstitutionHeader;
++ LEReferenceTo<LigatureSubstitutionHeader> ligatureSubstitutionHeader;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp b/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp
+@@ -40,10 +40,10 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 LigatureSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
++le_uint32 LigatureSubstitutionSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
+
+ if (coverageIndex >= 0) {
+ Offset ligSetTableOffset = SWAPW(ligSetTableOffsetArray[coverageIndex]);
+diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.h b/src/share/native/sun/font/layout/LigatureSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h
+@@ -50,6 +50,7 @@
+ le_uint16 ligatureCount;
+ Offset ligatureTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LigatureSetTable, ligatureTableOffsetArray)
+
+ struct LigatureTable
+ {
+@@ -57,14 +58,16 @@
+ le_uint16 compCount;
+ TTGlyphID componentArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LigatureTable, componentArray)
+
+ struct LigatureSubstitutionSubtable : GlyphSubstitutionSubtable
+ {
+ le_uint16 ligSetCount;
+ Offset ligSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const;
+ };
++LE_VAR_ARRAY(LigatureSubstitutionSubtable, ligSetTableOffsetArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
+@@ -44,7 +44,7 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator,
++le_uint32 LookupProcessor::applyLookupTable(const LEReferenceTo<LookupTable> &lookupTable, GlyphIterator *glyphIterator,
+ const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
+ if (LE_FAILURE(success)) {
+@@ -57,7 +57,7 @@
+ le_uint32 delta;
+
+ for (le_uint16 subtable = 0; subtable < subtableCount; subtable += 1) {
+- const LookupSubtable *lookupSubtable = lookupTable->getLookupSubtable(subtable);
++ LEReferenceTo<LookupSubtable> lookupSubtable = lookupTable->getLookupSubtable(lookupTable, subtable, success);
+
+ delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success);
+
+@@ -72,7 +72,7 @@
+ }
+
+ le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader,
++ le_bool rightToLeft, const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader,
+ const LEFontInstance *fontInstance, LEErrorCode& success) const
+ {
+ if (LE_FAILURE(success)) {
+@@ -89,22 +89,21 @@
+ rightToLeft, 0, 0, glyphDefinitionTableHeader);
+ le_int32 newGlyphCount = glyphCount;
+
+- for (le_uint16 order = 0; order < lookupOrderCount; order += 1) {
++ for (le_uint16 order = 0; order < lookupOrderCount && LE_SUCCESS(success); order += 1) {
+ le_uint16 lookup = lookupOrderArray[order];
+ FeatureMask selectMask = lookupSelectArray[lookup];
+
+ if (selectMask != 0) {
+- const LookupTable *lookupTable = lookupListTable->getLookupTable(lookup);
+-
+- if (!lookupTable)
+- continue;
+-
+- le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags);
++ const LEReferenceTo<LookupTable> lookupTable = lookupListTable->getLookupTable(lookupListTable, lookup, success);
++ if (!lookupTable.isValid() ||LE_FAILURE(success) ) {
++ continue;
++ }
++ le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags);
+
+ glyphIterator.reset(lookupFlags, selectMask);
+
+ while (glyphIterator.findFeatureTag()) {
+- applyLookupTable(lookupTable, &glyphIterator, fontInstance, success);
++ applyLookupTable(lookupTable, &glyphIterator, fontInstance, success); // TODO
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+@@ -124,7 +123,11 @@
+ return 0;
+ }
+
+- const LookupTable *lookupTable = lookupListTable->getLookupTable(lookupTableIndex);
++ const LEReferenceTo<LookupTable> lookupTable = lookupListTable->getLookupTable(lookupListTable, lookupTableIndex, success);
++ if (!lookupTable.isValid()) {
++ success = LE_INTERNAL_ERROR;
++ return 0;
++ }
+ le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags);
+ GlyphIterator tempIterator(*glyphIterator, lookupFlags);
+ le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success);
+@@ -132,33 +135,35 @@
+ return delta;
+ }
+
+-le_int32 LookupProcessor::selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order)
++le_int32 LookupProcessor::selectLookups(const LEReferenceTo<FeatureTable> &featureTable, FeatureMask featureMask, le_int32 order, LEErrorCode &success)
+ {
+- le_uint16 lookupCount = featureTable? SWAPW(featureTable->lookupCount) : 0;
++ le_uint16 lookupCount = featureTable.isValid()? SWAPW(featureTable->lookupCount) : 0;
+ le_int32 store = order;
+
+- for (le_uint16 lookup = 0; lookup < lookupCount; lookup += 1) {
+- le_uint16 lookupListIndex = SWAPW(featureTable->lookupListIndexArray[lookup]);
++ LEReferenceToArrayOf<le_uint16> lookupListIndexArray(featureTable, success, featureTable->lookupListIndexArray, lookupCount);
+
+- if (lookupListIndex >= lookupSelectCount)
+- continue;
++ for (le_uint16 lookup = 0; LE_SUCCESS(success) && lookup < lookupCount; lookup += 1) {
++ le_uint16 lookupListIndex = SWAPW(lookupListIndexArray.getObject(lookup,success));
++ if (lookupListIndex >= lookupSelectCount) {
++ continue;
++ }
+
+- lookupSelectArray[lookupListIndex] |= featureMask;
+- lookupOrderArray[store++] = lookupListIndex;
++ lookupSelectArray[lookupListIndex] |= featureMask;
++ lookupOrderArray[store++] = lookupListIndex;
+ }
+
+ return store - order;
+ }
+
+-LookupProcessor::LookupProcessor(const char *baseAddress,
++LookupProcessor::LookupProcessor(const LETableReference &baseAddress,
+ Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset,
+ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures,
+ LEErrorCode& success)
+- : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0),
+- lookupOrderArray(NULL), lookupOrderCount(0)
++ : lookupListTable(), featureListTable(), lookupSelectArray(NULL), lookupSelectCount(0),
++ lookupOrderArray(NULL), lookupOrderCount(0), fReference(baseAddress)
+ {
+- const ScriptListTable *scriptListTable = NULL;
+- const LangSysTable *langSysTable = NULL;
++ LEReferenceTo<ScriptListTable> scriptListTable;
++ LEReferenceTo<LangSysTable> langSysTable;
+ le_uint16 featureCount = 0;
+ le_uint16 lookupListCount = 0;
+ le_uint16 requiredFeatureIndex;
+@@ -168,29 +173,33 @@
+ }
+
+ if (scriptListOffset != 0) {
+- scriptListTable = (const ScriptListTable *) (baseAddress + scriptListOffset);
+- langSysTable = scriptListTable->findLanguage(scriptTag, languageTag);
++ scriptListTable = LEReferenceTo<ScriptListTable>(baseAddress, success, scriptListOffset);
++ langSysTable = scriptListTable->findLanguage(scriptListTable, scriptTag, languageTag, success);
+
+- if (langSysTable != 0) {
+- featureCount = SWAPW(langSysTable->featureCount);
+- }
++ if (langSysTable.isValid() && LE_SUCCESS(success)) {
++ featureCount = SWAPW(langSysTable->featureCount);
++ }
+ }
+
+ if (featureListOffset != 0) {
+- featureListTable = (const FeatureListTable *) (baseAddress + featureListOffset);
++ featureListTable = LEReferenceTo<FeatureListTable>(baseAddress, success, featureListOffset);
+ }
+
+ if (lookupListOffset != 0) {
+- lookupListTable = (const LookupListTable *) (baseAddress + lookupListOffset);
++ lookupListTable = LEReferenceTo<LookupListTable>(baseAddress,success, lookupListOffset);
++ if(LE_SUCCESS(success) && lookupListTable.isValid()) {
+ lookupListCount = SWAPW(lookupListTable->lookupCount);
++ }
+ }
+
+- if (langSysTable == NULL || featureListTable == NULL || lookupListTable == NULL ||
++ if (langSysTable.isEmpty() || featureListTable.isEmpty() || lookupListTable.isEmpty() ||
+ featureCount == 0 || lookupListCount == 0) {
+ return;
+ }
+
+- requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex);
++ if(langSysTable.isValid()) {
++ requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex);
++ }
+
+ lookupSelectArray = LE_NEW_ARRAY(FeatureMask, lookupListCount);
+ if (lookupSelectArray == NULL) {
+@@ -206,30 +215,38 @@
+
+ le_int32 count, order = 0;
+ le_uint32 featureReferences = 0;
+- const FeatureTable *featureTable = NULL;
++ LEReferenceTo<FeatureTable> featureTable;
+ LETag featureTag;
+
+- const FeatureTable *requiredFeatureTable = NULL;
++ LEReferenceTo<FeatureTable> requiredFeatureTable;
+ LETag requiredFeatureTag = 0x00000000U;
+
+ // Count the total number of lookups referenced by all features. This will
+ // be the maximum number of entries in the lookupOrderArray. We can't use
+ // lookupListCount because some lookups might be referenced by more than
+ // one feature.
+- for (le_uint32 feature = 0; feature < featureCount; feature += 1) {
+- le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]);
++ if(featureListTable.isValid() && LE_SUCCESS(success)) {
++ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount);
+
+- featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag);
++ for (le_uint32 feature = 0; LE_SUCCESS(success)&&(feature < featureCount); feature += 1) {
++ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature, success));
+
+- if (!featureTable)
+- continue;
++ featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success);
++ if (!featureTable.isValid() || LE_FAILURE(success)) {
++ continue;
++ }
++ featureReferences += SWAPW(featureTable->lookupCount);
++ }
++ }
+
+- featureReferences += SWAPW(featureTable->lookupCount);
++ if (!featureTable.isValid() || LE_FAILURE(success)) {
++ success = LE_INTERNAL_ERROR;
++ return;
+ }
+
+ if (requiredFeatureIndex != 0xFFFF) {
+- requiredFeatureTable = featureListTable->getFeatureTable(requiredFeatureIndex, &requiredFeatureTag);
+- featureReferences += SWAPW(featureTable->lookupCount);
++ requiredFeatureTable = featureListTable->getFeatureTable(featureListTable, requiredFeatureIndex, &requiredFeatureTag, success);
++ featureReferences += SWAPW(featureTable->lookupCount);
+ }
+
+ lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences);
+@@ -244,7 +261,7 @@
+
+ // If this is the required feature, add its lookups
+ if (requiredFeatureTag == fm.tag) {
+- count += selectLookups(requiredFeatureTable, fm.mask, order);
++ count += selectLookups(requiredFeatureTable, fm.mask, order, success);
+ }
+
+ if (orderFeatures) {
+@@ -254,7 +271,8 @@
+ }
+
+ for (le_uint16 feature = 0; feature < featureCount; feature += 1) {
+- le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]);
++ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount);
++ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success));
+
+ // don't add the required feature to the list more than once...
+ // TODO: Do we need this check? (Spec. says required feature won't be in feature list...)
+@@ -262,10 +280,10 @@
+ continue;
+ }
+
+- featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag);
++ featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success);
+
+ if (featureTag == fm.tag) {
+- count += selectLookups(featureTable, fm.mask, order + count);
++ count += selectLookups(featureTable, fm.mask, order + count, success);
+ }
+ }
+
+@@ -274,9 +292,10 @@
+ }
+
+ order += count;
+- } else {
+- for (le_uint16 feature = 0; feature < featureCount; feature += 1) {
+- le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]);
++ } else if(langSysTable.isValid()) {
++ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount);
++ for (le_uint16 feature = 0; LE_SUCCESS(success)&& (feature < featureCount); feature += 1) {
++ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success));
+
+ // don't add the required feature to the list more than once...
+ // NOTE: This check is commented out because the spec. says that
+@@ -288,10 +307,10 @@
+ }
+ #endif
+
+- featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag);
++ featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success);
+
+ if (featureTag == fm.tag) {
+- order += selectLookups(featureTable, fm.mask, order);
++ order += selectLookups(featureTable, fm.mask, order, success);
+ }
+ }
+ }
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.h b/src/share/native/sun/font/layout/LookupProcessor.h
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.h
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.h
+@@ -41,6 +41,7 @@
+ #include "LETypes.h"
+ #include "LEFontInstance.h"
+ #include "OpenTypeTables.h"
++#include "LETableReference.h"
+ //#include "Lookups.h"
+ //#include "Features.h"
+
+@@ -59,19 +60,21 @@
+ class LookupProcessor : public UMemory {
+ public:
+ le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments,
+- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const;
++ le_bool rightToLeft, const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+- le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
++ le_uint32 applyLookupTable(const LEReferenceTo<LookupTable> &lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+ le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
+
+- virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 subtableType,
++ virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 subtableType,
+ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const = 0;
+
+ virtual ~LookupProcessor();
+
++ const LETableReference &getReference() const { return fReference; }
++
+ protected:
+- LookupProcessor(const char *baseAddress,
++ LookupProcessor(const LETableReference &baseAddress,
+ Offset scriptListOffset,
+ Offset featureListOffset,
+ Offset lookupListOffset,
+@@ -84,10 +87,10 @@
+
+ LookupProcessor();
+
+- le_int32 selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order);
++ le_int32 selectLookups(const LEReferenceTo<FeatureTable> &featureTable, FeatureMask featureMask, le_int32 order, LEErrorCode &success);
+
+- const LookupListTable *lookupListTable;
+- const FeatureListTable *featureListTable;
++ LEReferenceTo<LookupListTable> lookupListTable;
++ LEReferenceTo<FeatureListTable> featureListTable;
+
+ FeatureMask *lookupSelectArray;
+ le_uint32 lookupSelectCount;
+@@ -95,6 +98,8 @@
+ le_uint16 *lookupOrderArray;
+ le_uint32 lookupOrderCount;
+
++ LETableReference fReference;
++
+ private:
+
+ LookupProcessor(const LookupProcessor &other); // forbid copying of this class
+diff --git a/src/share/native/sun/font/layout/LookupTables.cpp b/src/share/native/sun/font/layout/LookupTables.cpp
+--- jdk/src/share/native/sun/font/layout/LookupTables.cpp
++++ jdk/src/share/native/sun/font/layout/LookupTables.cpp
+@@ -49,22 +49,26 @@
+ of the derived classes, and implement it in the others by casting
+ the "this" pointer to the type that has the implementation.
+ */
+-const LookupSegment *BinarySearchLookupTable::lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const
++const LookupSegment *BinarySearchLookupTable::lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const
+ {
++
+ le_int16 unity = SWAPW(unitSize);
+ le_int16 probe = SWAPW(searchRange);
+ le_int16 extra = SWAPW(rangeShift);
+ TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph);
+- const LookupSegment *entry = segments;
+- const LookupSegment *trial = (const LookupSegment *) ((char *) entry + extra);
++ LEReferenceTo<LookupSegment> entry(base, success, segments);
++ LEReferenceTo<LookupSegment> trial(entry, success, extra);
++
++ if(LE_FAILURE(success)) return NULL;
+
+ if (SWAPW(trial->lastGlyph) <= ttGlyph) {
+ entry = trial;
+ }
+
+- while (probe > unity) {
++ while (probe > unity && LE_SUCCESS(success)) {
+ probe >>= 1;
+- trial = (const LookupSegment *) ((char *) entry + probe);
++ trial = entry; // copy
++ trial.addOffset(probe, success);
+
+ if (SWAPW(trial->lastGlyph) <= ttGlyph) {
+ entry = trial;
+@@ -72,28 +76,29 @@
+ }
+
+ if (SWAPW(entry->firstGlyph) <= ttGlyph) {
+- return entry;
++ return entry.getAlias();
+ }
+
+ return NULL;
+ }
+
+-const LookupSingle *BinarySearchLookupTable::lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const
++const LookupSingle *BinarySearchLookupTable::lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const
+ {
+ le_int16 unity = SWAPW(unitSize);
+ le_int16 probe = SWAPW(searchRange);
+ le_int16 extra = SWAPW(rangeShift);
+ TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph);
+- const LookupSingle *entry = entries;
+- const LookupSingle *trial = (const LookupSingle *) ((char *) entry + extra);
++ LEReferenceTo<LookupSingle> entry(base, success, entries);
++ LEReferenceTo<LookupSingle> trial(entry, success, extra);
+
+ if (SWAPW(trial->glyph) <= ttGlyph) {
+ entry = trial;
+ }
+
+- while (probe > unity) {
++ while (probe > unity && LE_SUCCESS(success)) {
+ probe >>= 1;
+- trial = (const LookupSingle *) ((char *) entry + probe);
++ trial = entry;
++ trial.addOffset(probe, success);
+
+ if (SWAPW(trial->glyph) <= ttGlyph) {
+ entry = trial;
+@@ -101,7 +106,7 @@
+ }
+
+ if (SWAPW(entry->glyph) == ttGlyph) {
+- return entry;
++ return entry.getAlias();
+ }
+
+ return NULL;
+diff --git a/src/share/native/sun/font/layout/LookupTables.h b/src/share/native/sun/font/layout/LookupTables.h
+--- jdk/src/share/native/sun/font/layout/LookupTables.h
++++ jdk/src/share/native/sun/font/layout/LookupTables.h
+@@ -39,6 +39,7 @@
+
+ #include "LETypes.h"
+ #include "LayoutTables.h"
++#include "LETableReference.h"
+
+ U_NAMESPACE_BEGIN
+
+@@ -79,30 +80,34 @@
+ le_int16 entrySelector;
+ le_int16 rangeShift;
+
+- const LookupSegment *lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const;
++ const LookupSegment *lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const;
+
+- const LookupSingle *lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const;
++ const LookupSingle *lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const;
+ };
+
+ struct SimpleArrayLookupTable : LookupTable
+ {
+ LookupValue valueArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SimpleArrayLookupTable, valueArray)
+
+ struct SegmentSingleLookupTable : BinarySearchLookupTable
+ {
+ LookupSegment segments[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SegmentSingleLookupTable, segments)
+
+ struct SegmentArrayLookupTable : BinarySearchLookupTable
+ {
+ LookupSegment segments[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SegmentArrayLookupTable, segments)
+
+ struct SingleTableLookupTable : BinarySearchLookupTable
+ {
+ LookupSingle entries[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SingleTableLookupTable, entries)
+
+ struct TrimmedArrayLookupTable : LookupTable
+ {
+@@ -110,6 +115,7 @@
+ TTGlyphID glyphCount;
+ LookupValue valueArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(TrimmedArrayLookupTable, valueArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/Lookups.cpp b/src/share/native/sun/font/layout/Lookups.cpp
+--- jdk/src/share/native/sun/font/layout/Lookups.cpp
++++ jdk/src/share/native/sun/font/layout/Lookups.cpp
+@@ -37,33 +37,35 @@
+
+ U_NAMESPACE_BEGIN
+
+-const LookupTable *LookupListTable::getLookupTable(le_uint16 lookupTableIndex) const
++const LEReferenceTo<LookupTable> LookupListTable::getLookupTable(const LEReferenceTo<LookupListTable> &base, le_uint16 lookupTableIndex, LEErrorCode &success) const
+ {
+- if (lookupTableIndex >= SWAPW(lookupCount)) {
+- return 0;
+- }
++ LEReferenceToArrayOf<Offset> lookupTableOffsetArrayRef(base, success, (const Offset*)&lookupTableOffsetArray, SWAPW(lookupCount));
+
+- Offset lookupTableOffset = lookupTableOffsetArray[lookupTableIndex];
+-
+- return (const LookupTable *) ((char *) this + SWAPW(lookupTableOffset));
++ if(LE_FAILURE(success) || lookupTableIndex>lookupTableOffsetArrayRef.getCount()) {
++ return LEReferenceTo<LookupTable>();
++ } else {
++ return LEReferenceTo<LookupTable>(base, success, SWAPW(lookupTableOffsetArrayRef.getObject(lookupTableIndex, success)));
++ }
+ }
+
+-const LookupSubtable *LookupTable::getLookupSubtable(le_uint16 subtableIndex) const
++const LEReferenceTo<LookupSubtable> LookupTable::getLookupSubtable(const LEReferenceTo<LookupTable> &base, le_uint16 subtableIndex, LEErrorCode &success) const
+ {
+- if (subtableIndex >= SWAPW(subTableCount)) {
+- return 0;
+- }
++ LEReferenceToArrayOf<Offset> subTableOffsetArrayRef(base, success, (const Offset*)&subTableOffsetArray, SWAPW(subTableCount));
+
+- Offset subtableOffset = subTableOffsetArray[subtableIndex];
+-
+- return (const LookupSubtable *) ((char *) this + SWAPW(subtableOffset));
++ if(LE_FAILURE(success) || subtableIndex>subTableOffsetArrayRef.getCount()) {
++ return LEReferenceTo<LookupSubtable>();
++ } else {
++ return LEReferenceTo<LookupSubtable>(base, success, SWAPW(subTableOffsetArrayRef.getObject(subtableIndex, success)));
++ }
+ }
+
+-le_int32 LookupSubtable::getGlyphCoverage(Offset tableOffset, LEGlyphID glyphID) const
++le_int32 LookupSubtable::getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const
+ {
+- const CoverageTable *coverageTable = (const CoverageTable *) ((char *) this + SWAPW(tableOffset));
++ const LEReferenceTo<CoverageTable> coverageTable(base, success, SWAPW(tableOffset));
+
+- return coverageTable->getGlyphCoverage(glyphID);
++ if(LE_FAILURE(success)) return 0;
++
++ return coverageTable->getGlyphCoverage(glyphID);
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/Lookups.h b/src/share/native/sun/font/layout/Lookups.h
+--- jdk/src/share/native/sun/font/layout/Lookups.h
++++ jdk/src/share/native/sun/font/layout/Lookups.h
+@@ -58,9 +58,14 @@
+ le_uint16 subtableFormat;
+ Offset coverageTableOffset;
+
+- inline le_int32 getGlyphCoverage(LEGlyphID glyphID) const;
++ inline le_int32 getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, LEGlyphID glyphID, LEErrorCode &success) const;
+
+- le_int32 getGlyphCoverage(Offset tableOffset, LEGlyphID glyphID) const;
++ le_int32 getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const;
++
++ // convenience
++ inline le_int32 getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const;
++
++ inline le_int32 getGlyphCoverage(const LETableReference &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const;
+ };
+
+ struct LookupTable
+@@ -70,20 +75,32 @@
+ le_uint16 subTableCount;
+ Offset subTableOffsetArray[ANY_NUMBER];
+
+- const LookupSubtable *getLookupSubtable(le_uint16 subtableIndex) const;
++ const LEReferenceTo<LookupSubtable> getLookupSubtable(const LEReferenceTo<LookupTable> &base, le_uint16 subtableIndex, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(LookupTable, subTableOffsetArray)
+
+ struct LookupListTable
+ {
+ le_uint16 lookupCount;
+ Offset lookupTableOffsetArray[ANY_NUMBER];
+
+- const LookupTable *getLookupTable(le_uint16 lookupTableIndex) const;
++ const LEReferenceTo<LookupTable> getLookupTable(const LEReferenceTo<LookupListTable> &base, le_uint16 lookupTableIndex, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(LookupListTable, lookupTableOffsetArray)
+
+-inline le_int32 LookupSubtable::getGlyphCoverage(LEGlyphID glyphID) const
++inline le_int32 LookupSubtable::getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, LEGlyphID glyphID, LEErrorCode &success) const
+ {
+- return getGlyphCoverage(coverageTableOffset, glyphID);
++ return getGlyphCoverage(base, coverageTableOffset, glyphID, success);
++}
++
++inline le_int32 LookupSubtable::getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const {
++ LEReferenceTo<LookupSubtable> thisRef(base, success, this);
++ return getGlyphCoverage(thisRef, glyphID, success);
++}
++
++inline le_int32 LookupSubtable::getGlyphCoverage(const LETableReference &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const {
++ LEReferenceTo<LookupSubtable> thisRef(base, success, this);
++ return getGlyphCoverage(thisRef, tableOffset, glyphID, success);
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MarkArrays.h b/src/share/native/sun/font/layout/MarkArrays.h
+--- jdk/src/share/native/sun/font/layout/MarkArrays.h
++++ jdk/src/share/native/sun/font/layout/MarkArrays.h
+@@ -57,6 +57,7 @@
+ le_int32 getMarkClass(LEGlyphID glyphID, le_int32 coverageIndex, const LEFontInstance *fontInstance,
+ LEPoint &anchor) const;
+ };
++LE_VAR_ARRAY(MarkArray, markRecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+@@ -51,10 +51,10 @@
+ return 0xFFFF;
+ }
+
+-le_int32 MarkToBasePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_int32 MarkToBasePositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID markGlyph = glyphIterator->getCurrGlyphID();
+- le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph);
++ le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success);
+
+ if (markCoverage < 0) {
+ // markGlyph isn't a covered mark glyph
+@@ -75,7 +75,7 @@
+ // FIXME: We probably don't want to find a base glyph before a previous ligature...
+ GlyphIterator baseIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreLigatures*/));
+ LEGlyphID baseGlyph = findBaseGlyph(&baseIterator);
+- le_int32 baseCoverage = getBaseCoverage((LEGlyphID) baseGlyph);
++ le_int32 baseCoverage = getBaseCoverage(base, (LEGlyphID) baseGlyph, success);
+ const BaseArray *baseArray = (const BaseArray *) ((char *) this + SWAPW(baseArrayOffset));
+ le_uint16 baseCount = SWAPW(baseArray->baseRecordCount);
+
+diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h
+@@ -48,7 +48,7 @@
+
+ struct MarkToBasePositioningSubtable : AttachmentPositioningSubtable
+ {
+- le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ LEGlyphID findBaseGlyph(GlyphIterator *glyphIterator) const;
+ };
+
+@@ -56,12 +56,14 @@
+ {
+ Offset baseAnchorTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(BaseRecord, baseAnchorTableOffsetArray)
+
+ struct BaseArray
+ {
+ le_int16 baseRecordCount;
+ BaseRecord baseRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(BaseArray, baseRecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp
+@@ -50,10 +50,10 @@
+ return 0xFFFF;
+ }
+
+-le_int32 MarkToLigaturePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_int32 MarkToLigaturePositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID markGlyph = glyphIterator->getCurrGlyphID();
+- le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph);
++ le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success);
+
+ if (markCoverage < 0) {
+ // markGlyph isn't a covered mark glyph
+@@ -74,7 +74,7 @@
+ // FIXME: we probably don't want to find a ligature before a previous base glyph...
+ GlyphIterator ligatureIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreBaseGlyphs*/));
+ LEGlyphID ligatureGlyph = findLigatureGlyph(&ligatureIterator);
+- le_int32 ligatureCoverage = getBaseCoverage((LEGlyphID) ligatureGlyph);
++ le_int32 ligatureCoverage = getBaseCoverage(base, (LEGlyphID) ligatureGlyph, success);
+ const LigatureArray *ligatureArray = (const LigatureArray *) ((char *) this + SWAPW(baseArrayOffset));
+ le_uint16 ligatureCount = SWAPW(ligatureArray->ligatureCount);
+
+diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h
+@@ -48,7 +48,7 @@
+
+ struct MarkToLigaturePositioningSubtable : AttachmentPositioningSubtable
+ {
+- le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ LEGlyphID findLigatureGlyph(GlyphIterator *glyphIterator) const;
+ };
+
+@@ -56,18 +56,21 @@
+ {
+ Offset ligatureAnchorTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(ComponentRecord, ligatureAnchorTableOffsetArray)
+
+ struct LigatureAttachTable
+ {
+ le_uint16 componentCount;
+ ComponentRecord componentRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LigatureAttachTable, componentRecordArray)
+
+ struct LigatureArray
+ {
+ le_uint16 ligatureCount;
+ Offset ligatureAttachTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LigatureArray, ligatureAttachTableOffsetArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp
+@@ -51,10 +51,10 @@
+ return 0xFFFF;
+ }
+
+-le_int32 MarkToMarkPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_int32 MarkToMarkPositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID markGlyph = glyphIterator->getCurrGlyphID();
+- le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph);
++ le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success);
+
+ if (markCoverage < 0) {
+ // markGlyph isn't a covered mark glyph
+@@ -74,7 +74,7 @@
+
+ GlyphIterator mark2Iterator(*glyphIterator);
+ LEGlyphID mark2Glyph = findMark2Glyph(&mark2Iterator);
+- le_int32 mark2Coverage = getBaseCoverage((LEGlyphID) mark2Glyph);
++ le_int32 mark2Coverage = getBaseCoverage(base, (LEGlyphID) mark2Glyph, success);
+ const Mark2Array *mark2Array = (const Mark2Array *) ((char *) this + SWAPW(baseArrayOffset));
+ le_uint16 mark2Count = SWAPW(mark2Array->mark2RecordCount);
+
+diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h
+--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h
++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h
+@@ -48,7 +48,7 @@
+
+ struct MarkToMarkPositioningSubtable : AttachmentPositioningSubtable
+ {
+- le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ LEGlyphID findMark2Glyph(GlyphIterator *glyphIterator) const;
+ };
+
+@@ -56,12 +56,14 @@
+ {
+ Offset mark2AnchorTableOffsetArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(Mark2Record, mark2AnchorTableOffsetArray)
+
+ struct Mark2Array
+ {
+ le_uint16 mark2RecordCount;
+ Mark2Record mark2RecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(Mark2Array, mark2RecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/MorphTables.cpp b/src/share/native/sun/font/layout/MorphTables.cpp
+--- jdk/src/share/native/sun/font/layout/MorphTables.cpp
++++ jdk/src/share/native/sun/font/layout/MorphTables.cpp
+@@ -44,61 +44,61 @@
+
+ U_NAMESPACE_BEGIN
+
+-void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const
++void MorphTableHeader::process(const LETableReference &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const
+ {
+- const ChainHeader *chainHeader = chains;
+- le_uint32 chainCount = SWAPL(this->nChains);
++ le_uint32 chainCount = SWAPL(this->nChains);
++ LEReferenceTo<ChainHeader> chainHeader(base, success, chains); // moving header
++ LEReferenceToArrayOf<ChainHeader> chainHeaderArray(base, success, chains, chainCount);
+ le_uint32 chain;
+
+- for (chain = 0; chain < chainCount; chain += 1) {
++ for (chain = 0; LE_SUCCESS(success) && (chain < chainCount); chain += 1) {
+ FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags);
+ le_uint32 chainLength = SWAPL(chainHeader->chainLength);
+ le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries);
+ le_int16 nSubtables = SWAPW(chainHeader->nSubtables);
+- const MorphSubtableHeader *subtableHeader =
+- (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries];
++ LEReferenceTo<MorphSubtableHeader> subtableHeader =
++ LEReferenceTo<MorphSubtableHeader>(chainHeader,success, &(chainHeader->featureTable[nFeatureEntries]));
+ le_int16 subtable;
+
+- for (subtable = 0; subtable < nSubtables; subtable += 1) {
++ for (subtable = 0; LE_SUCCESS(success) && (subtable < nSubtables); subtable += 1) {
+ le_int16 length = SWAPW(subtableHeader->length);
+ SubtableCoverage coverage = SWAPW(subtableHeader->coverage);
+ FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
+
+ // should check coverage more carefully...
+- if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) {
+- subtableHeader->process(glyphStorage);
++ if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0 && LE_SUCCESS(success)) {
++ subtableHeader->process(subtableHeader, glyphStorage, success);
+ }
+
+- subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length);
++ subtableHeader.addOffset(length, success);
+ }
+-
+- chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength);
++ chainHeader.addOffset(chainLength, success);
+ }
+ }
+
+-void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const
++void MorphSubtableHeader::process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const
+ {
+ SubtableProcessor *processor = NULL;
+
+ switch (SWAPW(coverage) & scfTypeMask)
+ {
+ case mstIndicRearrangement:
+- processor = new IndicRearrangementProcessor(this);
++ processor = new IndicRearrangementProcessor(base, success);
+ break;
+
+ case mstContextualGlyphSubstitution:
+- processor = new ContextualGlyphSubstitutionProcessor(this);
++ processor = new ContextualGlyphSubstitutionProcessor(base, success);
+ break;
+
+ case mstLigatureSubstitution:
+- processor = new LigatureSubstitutionProcessor(this);
++ processor = new LigatureSubstitutionProcessor(base, success);
+ break;
+
+ case mstReservedUnused:
+ break;
+
+ case mstNonContextualGlyphSubstitution:
+- processor = NonContextualGlyphSubstitutionProcessor::createInstance(this);
++ processor = NonContextualGlyphSubstitutionProcessor::createInstance(base, success);
+ break;
+
+ /*
+@@ -112,8 +112,10 @@
+ }
+
+ if (processor != NULL) {
+- processor->process(glyphStorage);
+- delete processor;
++ if(LE_SUCCESS(success)) {
++ processor->process(glyphStorage, success);
++ }
++ delete processor;
+ }
+ }
+
+diff --git a/src/share/native/sun/font/layout/MorphTables.h b/src/share/native/sun/font/layout/MorphTables.h
+--- jdk/src/share/native/sun/font/layout/MorphTables.h
++++ jdk/src/share/native/sun/font/layout/MorphTables.h
+@@ -39,6 +39,7 @@
+
+ #include "LETypes.h"
+ #include "LayoutTables.h"
++#include "LETableReference.h"
+
+ U_NAMESPACE_BEGIN
+
+@@ -65,6 +66,7 @@
+ le_int16 nSubtables;
+ FeatureTableEntry featureTable[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(ChainHeader, featureTable)
+
+ struct MorphTableHeader
+ {
+@@ -72,8 +74,9 @@
+ le_uint32 nChains;
+ ChainHeader chains[ANY_NUMBER];
+
+- void process(LEGlyphStorage &glyphStorage) const;
++ void process(const LETableReference& base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(MorphTableHeader, chains)
+
+ typedef le_int16 SubtableCoverage;
+
+@@ -102,7 +105,7 @@
+ SubtableCoverage coverage;
+ FeatureFlags subtableFeatures;
+
+- void process(LEGlyphStorage &glyphStorage) const;
++ void process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const;
+ };
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp b/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp
+@@ -39,7 +39,7 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const
++le_uint32 MultipleSubstitutionSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const
+ {
+ if (LE_FAILURE(success)) {
+ return 0;
+@@ -58,7 +58,7 @@
+ return 0;
+ }
+
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
+ le_uint16 seqCount = SWAPW(sequenceCount);
+
+ if (coverageIndex >= 0 && coverageIndex < seqCount) {
+diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.h b/src/share/native/sun/font/layout/MultipleSubstSubtables.h
+--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h
++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h
+@@ -50,14 +50,16 @@
+ le_uint16 glyphCount;
+ TTGlyphID substituteArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(SequenceTable, substituteArray)
+
+ struct MultipleSubstitutionSubtable : GlyphSubstitutionSubtable
+ {
+ le_uint16 sequenceCount;
+ Offset sequenceTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const;
+ };
++LE_VAR_ARRAY(MultipleSubstitutionSubtable, sequenceTableOffsetArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp
+@@ -47,8 +47,8 @@
+ {
+ }
+
+-NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : SubtableProcessor(morphSubtableHeader)
++NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : SubtableProcessor(morphSubtableHeader, success)
+ {
+ }
+
+@@ -56,26 +56,27 @@
+ {
+ }
+
+-SubtableProcessor *NonContextualGlyphSubstitutionProcessor::createInstance(const MorphSubtableHeader *morphSubtableHeader)
++SubtableProcessor *NonContextualGlyphSubstitutionProcessor::createInstance(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
+ {
+- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader;
++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success);
+
+- switch (SWAPW(header->table.format))
+- {
++ if(LE_FAILURE(success)) return NULL;
++
++ switch (SWAPW(header->table.format)) {
+ case ltfSimpleArray:
+- return new SimpleArrayProcessor(morphSubtableHeader);
++ return new SimpleArrayProcessor(morphSubtableHeader, success);
+
+ case ltfSegmentSingle:
+- return new SegmentSingleProcessor(morphSubtableHeader);
++ return new SegmentSingleProcessor(morphSubtableHeader, success);
+
+ case ltfSegmentArray:
+- return new SegmentArrayProcessor(morphSubtableHeader);
++ return new SegmentArrayProcessor(morphSubtableHeader, success);
+
+ case ltfSingleTable:
+- return new SingleTableProcessor(morphSubtableHeader);
++ return new SingleTableProcessor(morphSubtableHeader, success);
+
+ case ltfTrimmedArray:
+- return new TrimmedArrayProcessor(morphSubtableHeader);
++ return new TrimmedArrayProcessor(morphSubtableHeader, success);
+
+ default:
+ return NULL;
+diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h
+--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h
++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h
+@@ -49,13 +49,13 @@
+ class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor
+ {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage) = 0;
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0;
+
+- static SubtableProcessor *createInstance(const MorphSubtableHeader *morphSubtableHeader);
++ static SubtableProcessor *createInstance(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ protected:
+ NonContextualGlyphSubstitutionProcessor();
+- NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ NonContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &status);
+
+ virtual ~NonContextualGlyphSubstitutionProcessor();
+
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+@@ -101,25 +101,21 @@
+ static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap);
+
+ OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
+ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures),
+ fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE),
+- fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
++ fGSUBTable(gsubTable),
++ fGDEFTable(fontInstance, LE_GDEF_TABLE_TAG, success),
++ fGPOSTable(fontInstance, LE_GPOS_TABLE_TAG, success), fSubstitutionFilter(NULL)
+ {
+- static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG;
+- static const le_uint32 gposTableTag = LE_GPOS_TABLE_TAG;
+- const GlyphPositioningTableHeader *gposTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag);
+-
+ applyTypoFlags();
+
+ setScriptAndLanguageTags();
+
+- fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag);
+-
+ // JK patch, 2008-05-30 - see Sinhala bug report and LKLUG font
+ // if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) {
+- if (gposTable != NULL && gposTable->coversScript(fScriptTag)) {
+- fGPOSTable = gposTable;
++ if (!fGPOSTable.isEmpty()&& !fGPOSTable->coversScript(fGPOSTable, fScriptTag, success)) {
++ fGPOSTable.clear(); // already loaded
+ }
+ }
+
+@@ -154,7 +150,7 @@
+ OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+ le_int32 typoFlags, LEErrorCode &success)
+ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureOrder(FALSE),
+- fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
++ fGSUBTable(), fGDEFTable(), fGPOSTable(), fSubstitutionFilter(NULL)
+ {
+ applyTypoFlags();
+ setScriptAndLanguageTags();
+@@ -276,13 +272,13 @@
+ return 0;
+ }
+
+- if (fGSUBTable != NULL) {
+- if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) {
+- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ if (fGSUBTable.isValid()) {
++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fGSUBTable, fScriptTagV2, fLangSysTag, success)) {
++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter,
+ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
+
+ } else {
+- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
+ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
+ }
+ }
+@@ -303,13 +299,13 @@
+ return 0;
+ }
+
+- if (fGSUBTable != NULL) {
+- if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) {
+- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ if (fGSUBTable.isValid()) {
++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fGSUBTable,fScriptTagV2,fLangSysTag,success)) {
++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter,
+ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
+
+ } else {
+- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter,
+ fFeatureMap, fFeatureMapCount, fFeatureOrder, success);
+ }
+ }
+@@ -387,7 +383,7 @@
+ return;
+ }
+
+- if (fGPOSTable != NULL) {
++ if (!fGPOSTable.isEmpty()) {
+ GlyphPositionAdjustments *adjustments = new GlyphPositionAdjustments(glyphCount);
+ le_int32 i;
+
+@@ -410,19 +406,20 @@
+ }
+ #endif
+
+- if (fGPOSTable != NULL) {
+- if (fScriptTagV2 != nullScriptTag && fGPOSTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) {
+- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, fGDEFTable, success, fFontInstance,
+- fFeatureMap, fFeatureMapCount, fFeatureOrder);
++ if (!fGPOSTable.isEmpty()) {
++ if (fScriptTagV2 != nullScriptTag &&
++ fGPOSTable->coversScriptAndLanguage(fGPOSTable, fScriptTagV2,fLangSysTag,success)) {
++ fGPOSTable->process(fGPOSTable, glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag,
++ fGDEFTable, success, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder);
+
+ } else {
+- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, success, fFontInstance,
+- fFeatureMap, fFeatureMapCount, fFeatureOrder);
++ fGPOSTable->process(fGPOSTable, glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag,
++ fGDEFTable, success, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder);
+ }
+- } else if ( fTypoFlags & 0x1 ) {
+- static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
+- KernTable kt(fFontInstance, getFontTable(kernTableTag));
+- kt.process(glyphStorage);
++ } else if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */
++ LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success);
++ KernTable kt(kernTable, success);
++ kt.process(glyphStorage, success);
+ }
+
+ float xAdjust = 0, yAdjust = 0;
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+@@ -35,6 +35,7 @@
+ #include "LEGlyphFilter.h"
+ #include "LEFontInstance.h"
+ #include "LayoutEngine.h"
++#include "LETableReference.h"
+
+ #include "GlyphSubstitutionTables.h"
+ #include "GlyphDefinitionTables.h"
+@@ -88,7 +89,7 @@
+ * @internal
+ */
+ OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+@@ -228,21 +229,21 @@
+ *
+ * @internal
+ */
+- const GlyphSubstitutionTableHeader *fGSUBTable;
++ LEReferenceTo<GlyphSubstitutionTableHeader> fGSUBTable;
+
+ /**
+ * The address of the GDEF table.
+ *
+ * @internal
+ */
+- const GlyphDefinitionTableHeader *fGDEFTable;
++ LEReferenceTo<GlyphDefinitionTableHeader> fGDEFTable;
+
+ /**
+ * The address of the GPOS table.
+ *
+ * @internal
+ */
+- const GlyphPositioningTableHeader *fGPOSTable;
++ LEReferenceTo<GlyphPositioningTableHeader> fGPOSTable;
+
+ /**
+ * An optional filter used to inhibit substitutions
+diff --git a/src/share/native/sun/font/layout/OpenTypeTables.h b/src/share/native/sun/font/layout/OpenTypeTables.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeTables.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeTables.h
+@@ -38,6 +38,7 @@
+ */
+
+ #include "LETypes.h"
++#include "LETableReference.h"
+
+ U_NAMESPACE_BEGIN
+
+@@ -50,7 +51,7 @@
+ #define LE_GLYPH_GROUP_MASK 0x00000001UL
+ typedef le_uint32 FeatureMask;
+
+-#define SWAPT(atag) ((LETag) ((atag[0] << 24) + (atag[1] << 16) + (atag[2] << 8) + atag[3]))
++#define SWAPT(atag) ((LETag) (((atag[0]) << 24) + ((atag[1]) << 16) + ((atag[2]) << 8) + (atag[3])))
+
+ struct TagAndOffsetRecord
+ {
+diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.cpp b/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+@@ -76,58 +76,74 @@
+ return bit;
+ }
+
+-Offset OpenTypeUtilities::getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount)
++
++Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success)
+ {
+- le_uint8 bit = highBit(recordCount);
+- le_int32 power = 1 << bit;
+- le_int32 extra = recordCount - power;
+- le_int32 probe = power;
+- le_int32 index = 0;
++ if(LE_FAILURE(success)) return 0;
+
+- if (SWAPT(records[extra].tag) <= tag) {
+- index = extra;
++ le_uint32 recordCount = records.getCount();
++ le_uint8 bit = highBit(recordCount);
++ le_int32 power = 1 << bit;
++ le_int32 extra = recordCount - power;
++ le_int32 probe = power;
++ le_int32 index = 0;
++
++ {
++ const ATag &aTag = records.getAlias(extra,success)->tag;
++ if (SWAPT(aTag) <= tag) {
++ index = extra;
+ }
++ }
+
+- while (probe > (1 << 0)) {
+- probe >>= 1;
++ while (probe > (1 << 0) && LE_SUCCESS(success)) {
++ probe >>= 1;
+
+- if (SWAPT(records[index + probe].tag) <= tag) {
+- index += probe;
+- }
++ {
++ const ATag &aTag = records.getAlias(index+probe,success)->tag;
++ if (SWAPT(aTag) <= tag) {
++ index += probe;
++ }
+ }
++ }
+
+- if (SWAPT(records[index].tag) == tag) {
+- return SWAPW(records[index].offset);
++ {
++ const ATag &aTag = records.getAlias(index,success)->tag;
++ if (SWAPT(aTag) == tag) {
++ return SWAPW(records.getAlias(index,success)->offset);
+ }
++ }
+
+- return 0;
++ return 0;
+ }
+
+-le_int32 OpenTypeUtilities::getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount)
++le_int32 OpenTypeUtilities::getGlyphRangeIndex(TTGlyphID glyphID, const LEReferenceToArrayOf<GlyphRangeRecord> &records, LEErrorCode &success)
+ {
++ if(LE_FAILURE(success)) return -1;
++
++ le_uint32 recordCount = records.getCount();
+ le_uint8 bit = highBit(recordCount);
+ le_int32 power = 1 << bit;
+ le_int32 extra = recordCount - power;
+ le_int32 probe = power;
+ le_int32 range = 0;
+
+- if (recordCount == 0) {
+- return -1;
+- }
++ if (recordCount == 0) {
++ return -1;
++ }
+
+- if (SWAPW(records[extra].firstGlyph) <= glyphID) {
++ if (SWAPW(records(extra,success).firstGlyph) <= glyphID) {
+ range = extra;
+ }
+
+- while (probe > (1 << 0)) {
++ while (probe > (1 << 0) && LE_SUCCESS(success)) {
+ probe >>= 1;
+
+- if (SWAPW(records[range + probe].firstGlyph) <= glyphID) {
++ if (SWAPW(records(range + probe,success).firstGlyph) <= glyphID) {
+ range += probe;
+ }
+ }
+
+- if (SWAPW(records[range].firstGlyph) <= glyphID && SWAPW(records[range].lastGlyph) >= glyphID) {
++ if (SWAPW(records(range,success).firstGlyph) <= glyphID && SWAPW(records(range,success).lastGlyph) >= glyphID) {
+ return range;
+ }
+
+@@ -199,6 +215,38 @@
+ }
+ }
+
++U_NAMESPACE_END
+
++#if LE_ASSERT_BAD_FONT
++#include <stdio.h>
+
+-U_NAMESPACE_END
++static const char *letagToStr(LETag tag, char *str) {
++ str[0]= 0xFF & (tag>>24);
++ str[1]= 0xFF & (tag>>16);
++ str[2]= 0xFF & (tag>>8);
++ str[3]= 0xFF & (tag>>0);
++ str[4]= 0;
++ return str;
++}
++
++U_CAPI void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len) {
++ char tagbuf[5];
++
++ fprintf(stderr, "%s:%d: LETableReference@0x%p: ", f, l, what);
++ fprintf(stderr, msg, ptr, len);
++ fprintf(stderr, "\n");
++
++ for(int depth=0;depth<10&&(what!=NULL);depth++) {
++ for(int i=0;i<depth;i++) {
++ fprintf(stderr, " "); // indent
++ }
++ if(!what->isValid()) {
++ fprintf(stderr, "(invalid)");
++ }
++ fprintf(stderr, "@%p: tag (%s) font (0x%p), [0x%p+0x%lx]\n", what, letagToStr(what->getTag(), tagbuf), what->getFont(),
++ what->getAlias(), what->getLength());
++
++ what = what->getParent();
++ }
++}
++#endif
+diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.h b/src/share/native/sun/font/layout/OpenTypeUtilities.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h
+@@ -45,8 +45,17 @@
+ class OpenTypeUtilities /* not : public UObject because all methods are static */ {
+ public:
+ static le_int8 highBit(le_int32 value);
+- static Offset getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount);
+- static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount);
++ static Offset getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success);
++ /**
++ * @deprecated TODO remove
++ */
++ static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount) {
++ LEErrorCode success = LE_NO_ERROR;
++ LETableReference recordRef0((const le_uint8*)records);
++ LEReferenceToArrayOf<GlyphRangeRecord> recordRef(recordRef0, success, (size_t)0, recordCount);
++ return getGlyphRangeIndex(glyphID, recordRef, success);
++ }
++ static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const LEReferenceToArrayOf<GlyphRangeRecord> &records, LEErrorCode &success);
+ static le_int32 search(le_uint16 value, const le_uint16 array[], le_int32 count);
+ static le_int32 search(le_uint32 value, const le_uint32 array[], le_int32 count);
+ static void sort(le_uint16 *array, le_int32 count);
+diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp
+@@ -41,7 +41,7 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 PairPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 PairPositioningSubtable::process(const LEReferenceTo<PairPositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ switch(SWAPW(subtableFormat))
+ {
+@@ -50,27 +50,32 @@
+
+ case 1:
+ {
+- const PairPositioningFormat1Subtable *subtable = (const PairPositioningFormat1Subtable *) this;
++ const LEReferenceTo<PairPositioningFormat1Subtable> subtable(base, success, (const PairPositioningFormat1Subtable *) this);
+
+- return subtable->process(glyphIterator, fontInstance);
++ if(LE_SUCCESS(success))
++ return subtable->process(subtable, glyphIterator, fontInstance, success);
++ else
++ return 0;
+ }
+
+ case 2:
+ {
+- const PairPositioningFormat2Subtable *subtable = (const PairPositioningFormat2Subtable *) this;
++ const LEReferenceTo<PairPositioningFormat2Subtable> subtable(base, success, (const PairPositioningFormat2Subtable *) this);
+
+- return subtable->process(glyphIterator, fontInstance);
++ if(LE_SUCCESS(success))
++ return subtable->process(subtable, glyphIterator, fontInstance, success);
++ else
++ return 0;
+ }
+-
+ default:
+- return 0;
++ return 0;
+ }
+ }
+
+-le_uint32 PairPositioningFormat1Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 PairPositioningFormat1Subtable::process(const LEReferenceTo<PairPositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(firstGlyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, firstGlyph, success);
+ GlyphIterator tempIterator(*glyphIterator);
+
+ if (coverageIndex >= 0 && glyphIterator->next()) {
+@@ -110,10 +115,10 @@
+ return 0;
+ }
+
+-le_uint32 PairPositioningFormat2Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 PairPositioningFormat2Subtable::process(const LEReferenceTo<PairPositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(firstGlyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, firstGlyph, success);
+ GlyphIterator tempIterator(*glyphIterator);
+
+ if (coverageIndex >= 0 && glyphIterator->next()) {
+diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.h b/src/share/native/sun/font/layout/PairPositioningSubtables.h
+--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h
++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h
+@@ -59,13 +59,14 @@
+ le_uint16 pairValueCount;
+ PairValueRecord pairValueRecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(PairSetTable, pairValueRecordArray)
+
+ struct PairPositioningSubtable : GlyphPositioningSubtable
+ {
+ ValueFormat valueFormat1;
+ ValueFormat valueFormat2;
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<PairPositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ };
+
+ struct PairPositioningFormat1Subtable : PairPositioningSubtable
+@@ -73,12 +74,13 @@
+ le_uint16 pairSetCount;
+ Offset pairSetTableOffsetArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<PairPositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+
+ private:
+ const PairValueRecord *findPairValueRecord(TTGlyphID glyphID, const PairValueRecord *records,
+ le_uint16 recordCount, le_uint16 recordSize) const;
+ };
++LE_VAR_ARRAY(PairPositioningFormat1Subtable, pairSetTableOffsetArray)
+
+ // NOTE: ValueRecord has a variable size
+ struct Class2Record
+@@ -91,6 +93,7 @@
+ {
+ Class2Record class2RecordArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(Class1Record, class2RecordArray)
+
+ struct PairPositioningFormat2Subtable : PairPositioningSubtable
+ {
+@@ -100,8 +103,9 @@
+ le_uint16 class2Count;
+ Class1Record class1RecordArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<PairPositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(PairPositioningFormat2Subtable, class1RecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.cpp b/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp
+@@ -38,29 +38,33 @@
+
+ U_NAMESPACE_BEGIN
+
+-const LangSysTable *ScriptTable::findLanguage(LETag languageTag, le_bool exactMatch) const
++LEReferenceTo<LangSysTable> ScriptTable::findLanguage(const LETableReference& base, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const
+ {
+ le_uint16 count = SWAPW(langSysCount);
+ Offset langSysTableOffset = exactMatch? 0 : SWAPW(defaultLangSysTableOffset);
+
+ if (count > 0) {
+- Offset foundOffset =
+- OpenTypeUtilities::getTagOffset(languageTag, langSysRecordArray, count);
++ LEReferenceToArrayOf<TagAndOffsetRecord> langSysRecords(base, success, langSysRecordArray, count);
++ Offset foundOffset =
++ OpenTypeUtilities::getTagOffset(languageTag, langSysRecords, success);
+
+- if (foundOffset != 0) {
+- langSysTableOffset = foundOffset;
+- }
++ if (foundOffset != 0 && LE_SUCCESS(success)) {
++ langSysTableOffset = foundOffset;
++ }
+ }
+
+ if (langSysTableOffset != 0) {
+- return (const LangSysTable *) ((char *)this + langSysTableOffset);
++ return LEReferenceTo<LangSysTable>(base, success, langSysTableOffset);
+ }
+
+- return NULL;
++ return LEReferenceTo<LangSysTable>();
+ }
+
+-const ScriptTable *ScriptListTable::findScript(LETag scriptTag) const
++LEReferenceTo<ScriptTable> ScriptListTable::findScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const
+ {
++ if (LE_FAILURE(success) ) {
++ return LEReferenceTo<ScriptTable>(); // get out
++ }
+ /*
+ * There are some fonts that have a large, bogus value for scriptCount. To try
+ * and protect against this, we use the offset in the first scriptRecord,
+@@ -74,38 +78,53 @@
+ * to be unsorted.
+ */
+ le_uint16 count = SWAPW(scriptCount);
++
++ if (count == 0) {
++ return LEReferenceTo<ScriptTable>(); // no items, no search
++ }
++
++ // attempt to construct a ref with at least one element
++ LEReferenceToArrayOf<ScriptRecord> oneElementTable(base, success, &scriptRecordArray[0], 1);
++
++ if( LE_FAILURE(success) ) {
++ return LEReferenceTo<ScriptTable>(); // couldn't even read the first record - bad font.
++ }
++
+ le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER;
+ Offset scriptTableOffset = 0;
+
++
+ if (count > limit) {
+ // the scriptCount value is bogus; do a linear search
+ // because limit may still be too large.
+- for(le_int32 s = 0; s < limit; s += 1) {
+- if (SWAPT(scriptRecordArray[s].tag) == scriptTag) {
+- scriptTableOffset = SWAPW(scriptRecordArray[s].offset);
+- break;
+- }
++ LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], limit);
++ for(le_int32 s = 0; (s < limit)&&LE_SUCCESS(success); s += 1) {
++ if (SWAPT(scriptRecordArrayRef(s,success).tag) == scriptTag) {
++ scriptTableOffset = SWAPW(scriptRecordArrayRef(s,success).offset);
++ break;
++ }
+ }
+ } else {
+- scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count);
++ LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], count);
++ scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArrayRef, success); // TODO
+ }
+
+ if (scriptTableOffset != 0) {
+- return (const ScriptTable *) ((char *)this + scriptTableOffset);
++ return LEReferenceTo<ScriptTable>(base, success, scriptTableOffset);
+ }
+
+- return NULL;
++ return LEReferenceTo<ScriptTable>();
+ }
+
+-const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const
++LEReferenceTo<LangSysTable> ScriptListTable::findLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const
+ {
+- const ScriptTable *scriptTable = findScript(scriptTag);
++ const LEReferenceTo<ScriptTable> scriptTable = findScript(base, scriptTag, success);
+
+- if (scriptTable == 0) {
+- return NULL;
+- }
++ if (scriptTable.isEmpty()) {
++ return LEReferenceTo<LangSysTable>();
++ }
+
+- return scriptTable->findLanguage(languageTag, exactMatch);
++ return scriptTable->findLanguage(scriptTable, languageTag, success, exactMatch).reparent(base);
+ }
+
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.h b/src/share/native/sun/font/layout/ScriptAndLanguage.h
+--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h
++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h
+@@ -51,6 +51,7 @@
+ le_uint16 featureCount;
+ le_uint16 featureIndexArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(LangSysTable, featureIndexArray)
+
+ struct ScriptTable
+ {
+@@ -58,8 +59,9 @@
+ le_uint16 langSysCount;
+ LangSysRecord langSysRecordArray[ANY_NUMBER];
+
+- const LangSysTable *findLanguage(LETag languageTag, le_bool exactMatch = FALSE) const;
++ LEReferenceTo<LangSysTable> findLanguage(const LETableReference &base, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const;
+ };
++LE_VAR_ARRAY(ScriptTable, langSysRecordArray)
+
+ typedef TagAndOffsetRecord ScriptRecord;
+
+@@ -68,9 +70,10 @@
+ le_uint16 scriptCount;
+ ScriptRecord scriptRecordArray[ANY_NUMBER];
+
+- const ScriptTable *findScript(LETag scriptTag) const;
+- const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const;
++ LEReferenceTo<ScriptTable> findScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const;
++ LEReferenceTo<LangSysTable> findLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const;
+ };
++LE_VAR_ARRAY(ScriptListTable, scriptRecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp b/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+@@ -46,19 +46,18 @@
+ {
+ }
+
+-SegmentArrayProcessor::SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader)
++SegmentArrayProcessor::SegmentArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success)
+ {
+- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader;
+-
+- segmentArrayLookupTable = (const SegmentArrayLookupTable *) &header->table;
++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success);
++ segmentArrayLookupTable = LEReferenceTo<SegmentArrayLookupTable>(morphSubtableHeader, success, (const SegmentArrayLookupTable*)&header->table);
+ }
+
+ SegmentArrayProcessor::~SegmentArrayProcessor()
+ {
+ }
+
+-void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage)
++void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ const LookupSegment *segments = segmentArrayLookupTable->segments;
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+@@ -66,17 +65,16 @@
+
+ for (glyph = 0; glyph < glyphCount; glyph += 1) {
+ LEGlyphID thisGlyph = glyphStorage[glyph];
+- const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segments, thisGlyph);
++ const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success);
+
+ if (lookupSegment != NULL) {
+ TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph);
+ le_int16 offset = SWAPW(lookupSegment->value);
+
+ if (offset != 0) {
+- TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset);
+- TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]);
+-
+- glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
++ LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, LE_UNBOUNDED_ARRAY);
++ TTGlyphID newGlyph = SWAPW(glyphArray(LE_GET_GLYPH(thisGlyph) - firstGlyph, success));
++ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
+ }
+ }
+ }
+diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.h b/src/share/native/sun/font/layout/SegmentArrayProcessor.h
+--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h
++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h
+@@ -50,9 +50,9 @@
+ class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor
+ {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage);
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+- SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ SegmentArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ virtual ~SegmentArrayProcessor();
+
+@@ -74,7 +74,7 @@
+ SegmentArrayProcessor();
+
+ protected:
+- const SegmentArrayLookupTable *segmentArrayLookupTable;
++ LEReferenceTo<SegmentArrayLookupTable> segmentArrayLookupTable;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp b/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp
+@@ -46,29 +46,28 @@
+ {
+ }
+
+-SegmentSingleProcessor::SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader)
++SegmentSingleProcessor::SegmentSingleProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success)
+ {
+- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader;
+-
+- segmentSingleLookupTable = (const SegmentSingleLookupTable *) &header->table;
++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success);
++ segmentSingleLookupTable = LEReferenceTo<SegmentSingleLookupTable>(morphSubtableHeader, success, (const SegmentSingleLookupTable*)&header->table);
+ }
+
+ SegmentSingleProcessor::~SegmentSingleProcessor()
+ {
+ }
+
+-void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage)
++void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ const LookupSegment *segments = segmentSingleLookupTable->segments;
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+ le_int32 glyph;
+
+- for (glyph = 0; glyph < glyphCount; glyph += 1) {
++ for (glyph = 0; glyph < glyphCount && LE_SUCCESS(success); glyph += 1) {
+ LEGlyphID thisGlyph = glyphStorage[glyph];
+- const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segments, thisGlyph);
++ const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segmentSingleLookupTable, segments, thisGlyph, success);
+
+- if (lookupSegment != NULL) {
++ if (lookupSegment != NULL && LE_SUCCESS(success)) {
+ TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph) + SWAPW(lookupSegment->value);
+
+ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
+diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.h b/src/share/native/sun/font/layout/SegmentSingleProcessor.h
+--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h
++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h
+@@ -50,9 +50,9 @@
+ class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor
+ {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage);
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+- SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ SegmentSingleProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ virtual ~SegmentSingleProcessor();
+
+@@ -74,7 +74,7 @@
+ SegmentSingleProcessor();
+
+ protected:
+- const SegmentSingleLookupTable *segmentSingleLookupTable;
++ LEReferenceTo<SegmentSingleLookupTable> segmentSingleLookupTable;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/ShapingTypeData.cpp b/src/share/native/sun/font/layout/ShapingTypeData.cpp
+--- jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp
++++ jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp
+@@ -122,4 +122,6 @@
+ 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x05
+ };
+
++const size_t ArabicShaping::shapingTypeTableLen = sizeof(shapingTypeTable)/sizeof(shapingTypeTable[0]);
++
+ U_NAMESPACE_END
+diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp b/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp
+@@ -46,29 +46,29 @@
+ {
+ }
+
+-SimpleArrayProcessor::SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader)
++SimpleArrayProcessor::SimpleArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success)
+ {
+- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader;
+-
+- simpleArrayLookupTable = (const SimpleArrayLookupTable *) &header->table;
++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success);
++ simpleArrayLookupTable = LEReferenceTo<SimpleArrayLookupTable>(morphSubtableHeader, success, (const SimpleArrayLookupTable*)&header->table);
+ }
+
+ SimpleArrayProcessor::~SimpleArrayProcessor()
+ {
+ }
+
+-void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage)
++void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+ le_int32 glyph;
+
+- for (glyph = 0; glyph < glyphCount; glyph += 1) {
++ LEReferenceToArrayOf<LookupValue> valueArray(simpleArrayLookupTable, success, (const LookupValue*)&simpleArrayLookupTable->valueArray, LE_UNBOUNDED_ARRAY);
++
++ for (glyph = 0; LE_SUCCESS(success) && (glyph < glyphCount); glyph += 1) {
+ LEGlyphID thisGlyph = glyphStorage[glyph];
+ if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) {
+- TTGlyphID newGlyph = SWAPW(simpleArrayLookupTable->valueArray[LE_GET_GLYPH(thisGlyph)]);
+-
+- glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
++ TTGlyphID newGlyph = SWAPW(valueArray.getObject(LE_GET_GLYPH(thisGlyph),success));
++ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
+ }
+ }
+ }
+diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.h b/src/share/native/sun/font/layout/SimpleArrayProcessor.h
+--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h
++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h
+@@ -50,9 +50,9 @@
+ class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor
+ {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage);
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+- SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ SimpleArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ virtual ~SimpleArrayProcessor();
+
+@@ -74,7 +74,7 @@
+ SimpleArrayProcessor();
+
+ protected:
+- const SimpleArrayLookupTable *simpleArrayLookupTable;
++ LEReferenceTo<SimpleArrayLookupTable> simpleArrayLookupTable;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp b/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp
+@@ -40,7 +40,7 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 SinglePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 SinglePositioningSubtable::process(const LEReferenceTo<SinglePositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ switch(SWAPW(subtableFormat))
+ {
+@@ -49,16 +49,16 @@
+
+ case 1:
+ {
+- const SinglePositioningFormat1Subtable *subtable = (const SinglePositioningFormat1Subtable *) this;
++ const LEReferenceTo<SinglePositioningFormat1Subtable> subtable(base, success, (const SinglePositioningFormat1Subtable *) this);
+
+- return subtable->process(glyphIterator, fontInstance);
++ return subtable->process(subtable, glyphIterator, fontInstance, success);
+ }
+
+ case 2:
+ {
+- const SinglePositioningFormat2Subtable *subtable = (const SinglePositioningFormat2Subtable *) this;
++ const LEReferenceTo<SinglePositioningFormat2Subtable> subtable(base, success, (const SinglePositioningFormat2Subtable *) this);
+
+- return subtable->process(glyphIterator, fontInstance);
++ return subtable->process(subtable, glyphIterator, fontInstance, success);
+ }
+
+ default:
+@@ -66,10 +66,10 @@
+ }
+ }
+
+-le_uint32 SinglePositioningFormat1Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 SinglePositioningFormat1Subtable::process(const LEReferenceTo<SinglePositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
+
+ if (coverageIndex >= 0) {
+ valueRecord.adjustPosition(SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance);
+@@ -80,10 +80,10 @@
+ return 0;
+ }
+
+-le_uint32 SinglePositioningFormat2Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const
++le_uint32 SinglePositioningFormat2Subtable::process(const LEReferenceTo<SinglePositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int16 coverageIndex = (le_int16) getGlyphCoverage(glyph);
++ le_int16 coverageIndex = (le_int16) getGlyphCoverage(base, glyph, success);
+
+ if (coverageIndex >= 0) {
+ valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance);
+diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.h b/src/share/native/sun/font/layout/SinglePositioningSubtables.h
+--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h
++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h
+@@ -48,7 +48,7 @@
+
+ struct SinglePositioningSubtable : GlyphPositioningSubtable
+ {
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<SinglePositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ };
+
+ struct SinglePositioningFormat1Subtable : SinglePositioningSubtable
+@@ -56,7 +56,7 @@
+ ValueFormat valueFormat;
+ ValueRecord valueRecord;
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<SinglePositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ };
+
+ struct SinglePositioningFormat2Subtable : SinglePositioningSubtable
+@@ -65,8 +65,9 @@
+ le_uint16 valueCount;
+ ValueRecord valueRecordArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
++ le_uint32 process(const LEReferenceTo<SinglePositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const;
+ };
++LE_VAR_ARRAY(SinglePositioningFormat2Subtable, valueRecordArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp
+--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp
++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp
+@@ -39,7 +39,7 @@
+
+ U_NAMESPACE_BEGIN
+
+-le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
++le_uint32 SingleSubstitutionSubtable::process(const LEReferenceTo<SingleSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const
+ {
+ switch(SWAPW(subtableFormat))
+ {
+@@ -48,16 +48,16 @@
+
+ case 1:
+ {
+- const SingleSubstitutionFormat1Subtable *subtable = (const SingleSubstitutionFormat1Subtable *) this;
++ const LEReferenceTo<SingleSubstitutionFormat1Subtable> subtable(base, success, (const SingleSubstitutionFormat1Subtable *) this);
+
+- return subtable->process(glyphIterator, filter);
++ return subtable->process(subtable, glyphIterator, success, filter);
+ }
+
+ case 2:
+ {
+- const SingleSubstitutionFormat2Subtable *subtable = (const SingleSubstitutionFormat2Subtable *) this;
++ const LEReferenceTo<SingleSubstitutionFormat2Subtable> subtable(base, success, (const SingleSubstitutionFormat2Subtable *) this);
+
+- return subtable->process(glyphIterator, filter);
++ return subtable->process(subtable, glyphIterator, success, filter);
+ }
+
+ default:
+@@ -65,10 +65,10 @@
+ }
+ }
+
+-le_uint32 SingleSubstitutionFormat1Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
++le_uint32 SingleSubstitutionFormat1Subtable::process(const LEReferenceTo<SingleSubstitutionFormat1Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
+
+ if (coverageIndex >= 0) {
+ TTGlyphID substitute = ((TTGlyphID) LE_GET_GLYPH(glyph)) + SWAPW(deltaGlyphID);
+@@ -83,10 +83,10 @@
+ return 0;
+ }
+
+-le_uint32 SingleSubstitutionFormat2Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const
++le_uint32 SingleSubstitutionFormat2Subtable::process(const LEReferenceTo<SingleSubstitutionFormat2Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const
+ {
+ LEGlyphID glyph = glyphIterator->getCurrGlyphID();
+- le_int32 coverageIndex = getGlyphCoverage(glyph);
++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
+
+ if (coverageIndex >= 0) {
+ TTGlyphID substitute = SWAPW(substituteArray[coverageIndex]);
+diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h
+--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h
++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h
+@@ -47,14 +47,14 @@
+
+ struct SingleSubstitutionSubtable : GlyphSubstitutionSubtable
+ {
+- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(const LEReferenceTo<SingleSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const;
+ };
+
+ struct SingleSubstitutionFormat1Subtable : SingleSubstitutionSubtable
+ {
+ le_int16 deltaGlyphID;
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(const LEReferenceTo<SingleSubstitutionFormat1Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const;
+ };
+
+ struct SingleSubstitutionFormat2Subtable : SingleSubstitutionSubtable
+@@ -62,8 +62,9 @@
+ le_uint16 glyphCount;
+ TTGlyphID substituteArray[ANY_NUMBER];
+
+- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const;
++ le_uint32 process(const LEReferenceTo<SingleSubstitutionFormat2Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const;
+ };
++LE_VAR_ARRAY(SingleSubstitutionFormat2Subtable, substituteArray)
+
+ U_NAMESPACE_END
+ #endif
+diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.cpp b/src/share/native/sun/font/layout/SingleTableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp
+@@ -46,26 +46,25 @@
+ {
+ }
+
+-SingleTableProcessor::SingleTableProcessor(const MorphSubtableHeader *moprhSubtableHeader)
+- : NonContextualGlyphSubstitutionProcessor(moprhSubtableHeader)
++SingleTableProcessor::SingleTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success)
+ {
+- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) moprhSubtableHeader;
+-
+- singleTableLookupTable = (const SingleTableLookupTable *) &header->table;
++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success);
++ singleTableLookupTable = LEReferenceTo<SingleTableLookupTable>(morphSubtableHeader, success, (const SingleTableLookupTable*)&header->table);
+ }
+
+ SingleTableProcessor::~SingleTableProcessor()
+ {
+ }
+
+-void SingleTableProcessor::process(LEGlyphStorage &glyphStorage)
++void SingleTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+ const LookupSingle *entries = singleTableLookupTable->entries;
+ le_int32 glyph;
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+
+ for (glyph = 0; glyph < glyphCount; glyph += 1) {
+- const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(entries, glyphStorage[glyph]);
++ const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(singleTableLookupTable, entries, glyphStorage[glyph], success);
+
+ if (lookupSingle != NULL) {
+ glyphStorage[glyph] = SWAPW(lookupSingle->value);
+diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.h b/src/share/native/sun/font/layout/SingleTableProcessor.h
+--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.h
++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.h
+@@ -50,9 +50,9 @@
+ class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor
+ {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage);
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+- SingleTableProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ SingleTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ virtual ~SingleTableProcessor();
+
+@@ -74,7 +74,7 @@
+ SingleTableProcessor();
+
+ protected:
+- const SingleTableLookupTable *singleTableLookupTable;
++ LEReferenceTo<SingleTableLookupTable> singleTableLookupTable;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/StateTableProcessor.cpp b/src/share/native/sun/font/layout/StateTableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
+@@ -44,17 +44,18 @@
+ {
+ }
+
+-StateTableProcessor::StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : SubtableProcessor(morphSubtableHeader)
++StateTableProcessor::StateTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : SubtableProcessor(morphSubtableHeader, success), stateTableHeader(morphSubtableHeader, success),
++ stHeader(stateTableHeader, success, (const StateTableHeader*)&stateTableHeader->stHeader)
+ {
+- stateTableHeader = (const MorphStateTableHeader *) morphSubtableHeader;
+-
++ if(LE_FAILURE(success)) return;
+ stateSize = SWAPW(stateTableHeader->stHeader.stateSize);
+ classTableOffset = SWAPW(stateTableHeader->stHeader.classTableOffset);
+ stateArrayOffset = SWAPW(stateTableHeader->stHeader.stateArrayOffset);
+ entryTableOffset = SWAPW(stateTableHeader->stHeader.entryTableOffset);
+
+- classTable = (const ClassTable *) ((char *) &stateTableHeader->stHeader + classTableOffset);
++ classTable = LEReferenceTo<ClassTable>(stateTableHeader, success, ((char *) &stateTableHeader->stHeader + classTableOffset));
++ if(LE_FAILURE(success)) return;
+ firstGlyph = SWAPW(classTable->firstGlyph);
+ lastGlyph = firstGlyph + SWAPW(classTable->nGlyphs);
+ }
+@@ -63,9 +64,9 @@
+ {
+ }
+
+-void StateTableProcessor::process(LEGlyphStorage &glyphStorage)
++void StateTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
+-
++ if (LE_FAILURE(success)) return;
+ LE_STATE_PATIENCE_INIT();
+
+ // Start at state 0
+@@ -94,8 +95,8 @@
+ }
+ }
+
+- const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState);
+- EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode];
++ LEReferenceToArrayOf<EntryTableIndex> stateArray(stHeader, success, currentState, LE_UNBOUNDED_ARRAY);
++ EntryTableIndex entryTableIndex = stateArray.getObject((le_uint8)classCode, success);
+ LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
+ currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex);
+ LE_STATE_PATIENCE_INCR(currGlyph);
+diff --git a/src/share/native/sun/font/layout/StateTableProcessor.h b/src/share/native/sun/font/layout/StateTableProcessor.h
+--- jdk/src/share/native/sun/font/layout/StateTableProcessor.h
++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.h
+@@ -49,7 +49,7 @@
+ class StateTableProcessor : public SubtableProcessor
+ {
+ public:
+- void process(LEGlyphStorage &glyphStorage);
++ void process(LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+ virtual void beginStateTable() = 0;
+
+@@ -58,7 +58,7 @@
+ virtual void endStateTable() = 0;
+
+ protected:
+- StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ StateTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+ virtual ~StateTableProcessor();
+
+ StateTableProcessor();
+@@ -68,11 +68,12 @@
+ ByteOffset stateArrayOffset;
+ ByteOffset entryTableOffset;
+
+- const ClassTable *classTable;
++ LEReferenceTo<ClassTable> classTable;
+ TTGlyphID firstGlyph;
+ TTGlyphID lastGlyph;
+
+- const MorphStateTableHeader *stateTableHeader;
++ LEReferenceTo<MorphStateTableHeader> stateTableHeader;
++ LEReferenceTo<StateTableHeader> stHeader; // for convenience
+
+ private:
+ StateTableProcessor(const StateTableProcessor &other); // forbid copying of this class
+diff --git a/src/share/native/sun/font/layout/StateTables.h b/src/share/native/sun/font/layout/StateTables.h
+--- jdk/src/share/native/sun/font/layout/StateTables.h
++++ jdk/src/share/native/sun/font/layout/StateTables.h
+@@ -103,6 +103,7 @@
+ le_uint16 nGlyphs;
+ ClassCode classArray[ANY_NUMBER];
+ };
++LE_VAR_ARRAY(ClassTable, classArray)
+
+ enum StateNumber
+ {
+diff --git a/src/share/native/sun/font/layout/SubtableProcessor.cpp b/src/share/native/sun/font/layout/SubtableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp
+@@ -40,10 +40,10 @@
+ {
+ }
+
+-SubtableProcessor::SubtableProcessor(const MorphSubtableHeader *morphSubtableHeader)
++SubtableProcessor::SubtableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : length(0), coverage(0), subtableFeatures(0L), subtableHeader(morphSubtableHeader)
+ {
+- subtableHeader = morphSubtableHeader;
+-
++ if(LE_FAILURE(success)) return;
+ length = SWAPW(subtableHeader->length);
+ coverage = SWAPW(subtableHeader->coverage);
+ subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
+diff --git a/src/share/native/sun/font/layout/SubtableProcessor.h b/src/share/native/sun/font/layout/SubtableProcessor.h
+--- jdk/src/share/native/sun/font/layout/SubtableProcessor.h
++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.h
+@@ -46,11 +46,11 @@
+
+ class SubtableProcessor : public UMemory {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage) = 0;
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0;
+ virtual ~SubtableProcessor();
+
+ protected:
+- SubtableProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ SubtableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ SubtableProcessor();
+
+@@ -58,7 +58,7 @@
+ SubtableCoverage coverage;
+ FeatureFlags subtableFeatures;
+
+- const MorphSubtableHeader *subtableHeader;
++ const LEReferenceTo<MorphSubtableHeader> subtableHeader;
+
+ private:
+
+diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp b/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp
+@@ -134,11 +134,10 @@
+ return;
+ }
+
+- if (fTypoFlags & 0x1) { /* kerning enabled */
+- static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
+-
+- KernTable kt(fFontInstance, getFontTable(kernTableTag));
+- kt.process(glyphStorage);
++ if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */
++ LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success);
++ KernTable kt(kernTable, success);
++ kt.process(glyphStorage, success);
+ }
+
+ // default is no adjustments
+diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp b/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp
+@@ -49,7 +49,7 @@
+ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine)
+
+ TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
+ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
+ {
+ fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount);
+diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.h b/src/share/native/sun/font/layout/TibetanLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.h
+@@ -83,7 +83,7 @@
+ * @internal
+ */
+ TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success);
++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
+
+ /**
+ * This constructor is used when the font requires a "canned" GSUB table which can't be known
+diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp b/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp
+@@ -46,22 +46,28 @@
+ {
+ }
+
+-TrimmedArrayProcessor::TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader)
+- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader)
++TrimmedArrayProcessor::TrimmedArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success), firstGlyph(0), lastGlyph(0)
+ {
+- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader;
++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success);
+
+- trimmedArrayLookupTable = (const TrimmedArrayLookupTable *) &header->table;
+- firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph);
+- lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount);
++ if(LE_FAILURE(success)) return;
++
++ trimmedArrayLookupTable = LEReferenceTo<TrimmedArrayLookupTable>(morphSubtableHeader, success, (const TrimmedArrayLookupTable*)&header->table);
++
++ if(LE_FAILURE(success)) return;
++
++ firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph);
++ lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount);
+ }
+
+ TrimmedArrayProcessor::~TrimmedArrayProcessor()
+ {
+ }
+
+-void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage)
++void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
+ {
++ if(LE_FAILURE(success)) return;
+ le_int32 glyphCount = glyphStorage.getGlyphCount();
+ le_int32 glyph;
+
+diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.h b/src/share/native/sun/font/layout/TrimmedArrayProcessor.h
+--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h
++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h
+@@ -50,9 +50,9 @@
+ class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor
+ {
+ public:
+- virtual void process(LEGlyphStorage &glyphStorage);
++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+- TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader);
++ TrimmedArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
+
+ virtual ~TrimmedArrayProcessor();
+
+@@ -76,7 +76,7 @@
+ protected:
+ TTGlyphID firstGlyph;
+ TTGlyphID lastGlyph;
+- const TrimmedArrayLookupTable *trimmedArrayLookupTable;
++ LEReferenceTo<TrimmedArrayLookupTable> trimmedArrayLookupTable;
+
+ };
+
+diff --git a/src/share/native/sun/font/layout/ValueRecords.h b/src/share/native/sun/font/layout/ValueRecords.h
+--- jdk/src/share/native/sun/font/layout/ValueRecords.h
++++ jdk/src/share/native/sun/font/layout/ValueRecords.h
+@@ -64,6 +64,7 @@
+ static le_int16 getFieldCount(ValueFormat valueFormat);
+ static le_int16 getFieldIndex(ValueFormat valueFormat, ValueRecordField field);
+ };
++LE_VAR_ARRAY(ValueRecord, values)
+
+ enum ValueRecordFields
+ {
+diff --git a/src/share/native/sun/font/sunFont.c b/src/share/native/sun/font/sunFont.c
+--- jdk/src/share/native/sun/font/sunFont.c
++++ jdk/src/share/native/sun/font/sunFont.c
+@@ -376,22 +376,20 @@
+ JNIEXPORT TTLayoutTableCache* newLayoutTableCache() {
+ TTLayoutTableCache* ltc = calloc(1, sizeof(TTLayoutTableCache));
+ if (ltc) {
+- ltc->gsub_len = -1;
+- ltc->gpos_len = -1;
+- ltc->gdef_len = -1;
+- ltc->mort_len = -1;
+- ltc->kern_len = -1;
++ int i;
++ for(i=0;i<LAYOUTCACHE_ENTRIES;i++) {
++ ltc->entries[i].len = -1;
++ }
+ }
+ return ltc;
+ }
+
+ JNIEXPORT void freeLayoutTableCache(TTLayoutTableCache* ltc) {
+ if (ltc) {
+- if (ltc->gsub) free(ltc->gsub);
+- if (ltc->gpos) free(ltc->gpos);
+- if (ltc->gdef) free(ltc->gdef);
+- if (ltc->mort) free(ltc->mort);
+- if (ltc->kern) free(ltc->kern);
++ int i;
++ for(i=0;i<LAYOUTCACHE_ENTRIES;i++) {
++ if(ltc->entries[i].ptr) free (ltc->entries[i].ptr);
++ }
+ if (ltc->kernPairs) free(ltc->kernPairs);
+ free(ltc);
+ }
diff --git a/java/openjdk6/files/icedtea/security/20130416/8001040.patch b/java/openjdk6/files/icedtea/security/20130416/8001040.patch
new file mode 100644
index 000000000000..56da89c9f3ff
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8001040.patch
@@ -0,0 +1,113 @@
+# HG changeset patch
+# User andrew
+# Date 1365766584 -3600
+# Node ID ac0858a12d62c384c53a048a634d25dc1f8f1b72
+# Parent 5ed9acc1f6be298713f10ad71c33564d48f46555
+8001040: Rework RMI model
+Reviewed-by: alanb, ahgross, coffeys, dmocek
+
+diff --git a/src/share/classes/sun/rmi/server/MarshalInputStream.java b/src/share/classes/sun/rmi/server/MarshalInputStream.java
+--- jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java
++++ jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java
+@@ -55,13 +55,19 @@
+ public class MarshalInputStream extends ObjectInputStream {
+
+ /**
+- * value of "java.rmi.server.useCodebaseOnly" property,
++ * Value of "java.rmi.server.useCodebaseOnly" property,
+ * as cached at class initialization time.
++ *
++ * The default value is true. That is, the value is true
++ * if the property is absent or is not equal to "false".
++ * The value is only false when the property is present
++ * and is equal to "false".
+ */
+ private static final boolean useCodebaseOnlyProperty =
+- ((Boolean) java.security.AccessController.doPrivileged(
+- new sun.security.action.GetBooleanAction(
+- "java.rmi.server.useCodebaseOnly"))).booleanValue();
++ ! java.security.AccessController.doPrivileged(
++ new sun.security.action.GetPropertyAction(
++ "java.rmi.server.useCodebaseOnly", "true"))
++ .equalsIgnoreCase("false");
+
+ /** table to hold sun classes to which access is explicitly permitted */
+ protected static Map permittedSunClasses = new HashMap(3);
+diff --git a/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java b/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java
+--- jdk/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java
++++ jdk/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java
+@@ -31,7 +31,8 @@
+ *
+ * @library ../../testlibrary
+ * @build ClassPathCodebase Dummy
+- * @run main/othervm/policy=security.policy ClassPathCodebase
++ * @run main/othervm/policy=security.policy
++ * -Djava.rmi.server.useCodebaseOnly=false ClassPathCodebase
+ */
+
+ import java.io.*;
+diff --git a/test/java/rmi/registry/readTest/readTest.sh b/test/java/rmi/registry/readTest/readTest.sh
+--- jdk/test/java/rmi/registry/readTest/readTest.sh
++++ jdk/test/java/rmi/registry/readTest/readTest.sh
+@@ -52,7 +52,8 @@
+ RMIREG_OUT=rmi.out
+ #start rmiregistry without any local classes on classpath
+ cd rmi_tmp
+-${TESTJAVA}${FS}bin${FS}rmiregistry 7491 > ..${FS}${RMIREG_OUT} 2>&1 &
++${TESTJAVA}${FS}bin${FS}rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false \
++ ${TESTTOOLVMOPTS} 64005 > ..${FS}${RMIREG_OUT} 2>&1 &
+ RMIREG_PID=$!
+ # allow some time to start
+ sleep 3
+diff --git a/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java b/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java
+--- jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java
++++ jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java
+@@ -68,6 +68,10 @@
+ TestLibrary.bomb(e);
+ }
+
++ System.err.println("Setting codebase property to: " + remoteCodebase);
++ System.setProperty("java.rmi.server.codebase",
++ remoteCodebase.toString());
++
+ /*
+ * Load Foo from a non-RMI class loader so that it won't be already
+ * loaded by an RMI class loader in this VM (for whatever that's
+diff --git a/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy b/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy
+--- jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy
++++ jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy
+@@ -7,6 +7,8 @@
+ };
+
+ grant {
++ permission java.util.PropertyPermission
++ "java.rmi.server.codebase", "read,write";
+
+ // permissions needed to move classes into separate codebase directories
+ permission java.io.FilePermission
+diff --git a/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java b/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java
+--- jdk/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java
++++ jdk/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java
+@@ -32,7 +32,8 @@
+ * @library ../../../testlibrary
+ * @build TestLibrary FnnClass FnnUnmarshal LoadProxyClasses NonpublicInterface
+ * @build NonpublicInterface1 PublicInterface PublicInterface1
+- * @run main/othervm/policy=security.policy LoadProxyClasses
++ * @run main/othervm/policy=security.policy
++ * -Djava.rmi.server.useCodebaseOnly=false LoadProxyClasses
+ */
+
+ import java.rmi.server.RMIClassLoader;
+diff --git a/test/java/rmi/testlibrary/RMID.java b/test/java/rmi/testlibrary/RMID.java
+--- jdk/test/java/rmi/testlibrary/RMID.java
++++ jdk/test/java/rmi/testlibrary/RMID.java
+@@ -109,6 +109,9 @@
+ if (!TestParams.testClasses.equals("")) {
+ args += " -C-Dtest.classes=" + TestParams.testClasses;
+ }
++
++ args += " -C-Djava.rmi.server.useCodebaseOnly=false ";
++
+ args += " " + getCodeCoverageArgs();
+ return args;
+ }
diff --git a/java/openjdk6/files/icedtea/security/20130416/8001322.patch b/java/openjdk6/files/icedtea/security/20130416/8001322.patch
new file mode 100644
index 000000000000..766d7270a1ab
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8001322.patch
@@ -0,0 +1,61 @@
+# HG changeset patch
+# User dfuchs
+# Date 1363010839 -3600
+# Node ID 4a3260353853c3590ceb915337e21fe17aa07dbd
+# Parent ac0858a12d62c384c53a048a634d25dc1f8f1b72
+8001322: Refactor deserialization
+Reviewed-by: mchung, skoivu, smarks
+
+diff --git a/src/share/classes/java/io/ObjectInputStream.java b/src/share/classes/java/io/ObjectInputStream.java
+--- jdk/src/share/classes/java/io/ObjectInputStream.java
++++ jdk/src/share/classes/java/io/ObjectInputStream.java
+@@ -41,6 +41,7 @@
+ import java.util.concurrent.ConcurrentMap;
+ import java.util.concurrent.atomic.AtomicBoolean;
+ import static java.io.ObjectStreamClass.processQueue;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * An ObjectInputStream deserializes primitive data and objects previously
+@@ -1518,6 +1519,12 @@
+ }
+ }
+
++ private boolean isCustomSubclass() {
++ // Return true if this class is a custom subclass of ObjectInputStream
++ return getClass().getClassLoader()
++ != ObjectInputStream.class.getClassLoader();
++ }
++
+ /**
+ * Reads in and returns class descriptor for a dynamic proxy class. Sets
+ * passHandle to proxy class descriptor's assigned handle. If proxy class
+@@ -1547,6 +1554,15 @@
+ try {
+ if ((cl = resolveProxyClass(ifaces)) == null) {
+ resolveEx = new ClassNotFoundException("null class");
++ } else if (!Proxy.isProxyClass(cl)) {
++ throw new InvalidClassException("Not a proxy");
++ } else {
++ // ReflectUtil.checkProxyPackageAccess makes a test
++ // equivalent to isCustomSubclass so there's no need
++ // to condition this call to isCustomSubclass == true here.
++ ReflectUtil.checkProxyPackageAccess(
++ getClass().getClassLoader(),
++ cl.getInterfaces());
+ }
+ } catch (ClassNotFoundException ex) {
+ resolveEx = ex;
+@@ -1588,9 +1604,12 @@
+ Class cl = null;
+ ClassNotFoundException resolveEx = null;
+ bin.setBlockDataMode(true);
++ final boolean checksRequired = isCustomSubclass();
+ try {
+ if ((cl = resolveClass(readDesc)) == null) {
+ resolveEx = new ClassNotFoundException("null class");
++ } else if (checksRequired) {
++ ReflectUtil.checkPackageAccess(cl);
+ }
+ } catch (ClassNotFoundException ex) {
+ resolveEx = ex;
diff --git a/java/openjdk6/files/icedtea/security/20130416/8001329.patch b/java/openjdk6/files/icedtea/security/20130416/8001329.patch
new file mode 100644
index 000000000000..592c665a3be5
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8001329.patch
@@ -0,0 +1,32 @@
+# HG changeset patch
+# User dmocek
+# Date 1360111105 28800
+# Node ID a0e51ed355c9ae1256f8d344df34babb87a1edce
+# Parent 4a3260353853c3590ceb915337e21fe17aa07dbd
+8001329: Augment RMI logging
+Reviewed-by: smarks, hawtin, alanb
+
+diff --git a/src/share/classes/java/rmi/server/LogStream.java b/src/share/classes/java/rmi/server/LogStream.java
+--- jdk/src/share/classes/java/rmi/server/LogStream.java
++++ jdk/src/share/classes/java/rmi/server/LogStream.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -120,6 +120,13 @@
+ */
+ @Deprecated
+ public static synchronized void setDefaultStream(PrintStream newDefault) {
++ SecurityManager sm = System.getSecurityManager();
++
++ if (sm != null) {
++ sm.checkPermission(
++ new java.util.logging.LoggingPermission("control", null));
++ }
++
+ defaultStream = newDefault;
+ }
+
diff --git a/java/openjdk6/files/icedtea/security/20130416/8003335.patch b/java/openjdk6/files/icedtea/security/20130416/8003335.patch
new file mode 100644
index 000000000000..ae733a018f2a
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8003335.patch
@@ -0,0 +1,63 @@
+# HG changeset patch
+# User chegar
+# Date 1356010827 0
+# Node ID 3c7eb39c811464c98847a4f1a167636c1db80f17
+# Parent a0e51ed355c9ae1256f8d344df34babb87a1edce
+8003335: Better handling of Finalizer thread
+Reviewed-by: alanb, ahgross
+
+diff --git a/src/share/classes/java/lang/ref/Finalizer.java b/src/share/classes/java/lang/ref/Finalizer.java
+--- jdk/src/share/classes/java/lang/ref/Finalizer.java
++++ jdk/src/share/classes/java/lang/ref/Finalizer.java
+@@ -38,9 +38,9 @@
+ */
+ static native void invokeFinalizeMethod(Object o) throws Throwable;
+
+- static private ReferenceQueue queue = new ReferenceQueue();
+- static private Finalizer unfinalized = null;
+- static private Object lock = new Object();
++ private static ReferenceQueue queue = new ReferenceQueue();
++ private static Finalizer unfinalized = null;
++ private static final Object lock = new Object();
+
+ private Finalizer
+ next = null,
+@@ -142,7 +142,11 @@
+ /* Called by Runtime.runFinalization() */
+ static void runFinalization() {
+ forkSecondaryFinalizer(new Runnable() {
++ private volatile boolean running;
+ public void run() {
++ if (running)
++ return;
++ running = true;
+ for (;;) {
+ Finalizer f = (Finalizer)queue.poll();
+ if (f == null) break;
+@@ -155,7 +159,11 @@
+ /* Invoked by java.lang.Shutdown */
+ static void runAllFinalizers() {
+ forkSecondaryFinalizer(new Runnable() {
++ private volatile boolean running;
+ public void run() {
++ if (running)
++ return;
++ running = true;
+ for (;;) {
+ Finalizer f;
+ synchronized (lock) {
+@@ -168,10 +176,14 @@
+ }
+
+ private static class FinalizerThread extends Thread {
++ private volatile boolean running;
+ FinalizerThread(ThreadGroup g) {
+ super(g, "Finalizer");
+ }
+ public void run() {
++ if (running)
++ return;
++ running = true;
+ for (;;) {
+ try {
+ Finalizer f = (Finalizer)queue.remove();
diff --git a/java/openjdk6/files/icedtea/security/20130416/8003445.patch b/java/openjdk6/files/icedtea/security/20130416/8003445.patch
new file mode 100644
index 000000000000..2d53b2959e65
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8003445.patch
@@ -0,0 +1,77 @@
+# HG changeset patch
+# User andrew
+# Date 1365768981 -3600
+# Node ID 8f5ad2cacf6fff8efd817c5373469037d945f3dc
+# Parent 3c7eb39c811464c98847a4f1a167636c1db80f17
+8003445: Adjust JAX-WS to focus on API
+Reviewed-by: vinnie, ahgross, mgrebac
+
+diff --git a/src/share/lib/security/java.security b/src/share/lib/security/java.security
+--- jdk/src/share/lib/security/java.security
++++ jdk/src/share/lib/security/java.security
+@@ -150,7 +150,8 @@
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+- com.sun.org.apache.xml.internal.utils.
++ com.sun.org.apache.xml.internal.utils.,\
++ com.sun.org.glassfish.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -185,7 +186,8 @@
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+- com.sun.org.apache.xml.internal.utils.
++ com.sun.org.apache.xml.internal.utils.,\
++ com.sun.org.glassfish.
+
+ #
+ # Determines whether this properties file can be appended to
+diff --git a/src/share/lib/security/java.security-solaris b/src/share/lib/security/java.security-solaris
+--- jdk/src/share/lib/security/java.security-solaris
++++ jdk/src/share/lib/security/java.security-solaris
+@@ -151,7 +151,8 @@
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+- com.sun.org.apache.xml.internal.utils.
++ com.sun.org.apache.xml.internal.utils.,\
++ com.sun.org.glassfish.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -186,7 +187,8 @@
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+- com.sun.org.apache.xml.internal.utils.
++ com.sun.org.apache.xml.internal.utils.,\
++ com.sun.org.glassfish.
+
+ #
+ # Determines whether this properties file can be appended to
+diff --git a/src/share/lib/security/java.security-windows b/src/share/lib/security/java.security-windows
+--- jdk/src/share/lib/security/java.security-windows
++++ jdk/src/share/lib/security/java.security-windows
+@@ -151,7 +151,8 @@
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+- com.sun.org.apache.xml.internal.utils.
++ com.sun.org.apache.xml.internal.utils.,\
++ com.sun.org.glassfish.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -186,7 +187,8 @@
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+- com.sun.org.apache.xml.internal.utils.
++ com.sun.org.apache.xml.internal.utils.,\
++ com.sun.org.glassfish.
+
+ #
+ # Determines whether this properties file can be appended to
diff --git a/java/openjdk6/files/icedtea/security/20130416/8003543.patch b/java/openjdk6/files/icedtea/security/20130416/8003543.patch
new file mode 100644
index 000000000000..8178f0b5eee6
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8003543.patch
@@ -0,0 +1,227 @@
+--- /dev/null 2013-04-25 15:02:13.000000000 -0400
++++ jaxws/patches/jaxws_src/8003543.patch 2013-04-25 15:03:47.000000000 -0400
+@@ -0,0 +1,224 @@
++--- src/com/sun/xml/internal/org/jvnet/mimepull/MemoryData.java
+++++ src/com/sun/xml/internal/org/jvnet/mimepull/MemoryData.java
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -27,6 +27,7 @@
++ import java.nio.ByteBuffer;
++ import java.io.File;
++ import java.io.IOException;
+++import java.util.logging.Level;
++ import java.util.logging.Logger;
++
++ /**
++@@ -49,41 +50,45 @@
++ }
++
++ // size of the chunk given by the parser
+++ @Override
++ public int size() {
++ return len;
++ }
++
+++ @Override
++ public byte[] read() {
++ return data;
++ }
++
+++ @Override
++ public long writeTo(DataFile file) {
++ return file.writeTo(data, 0, len);
++ }
++
++ /**
++- *
++ * @param dataHead
++ * @param buf
++ * @return
++ */
+++ @Override
++ public Data createNext(DataHead dataHead, ByteBuffer buf) {
++ if (!config.isOnlyMemory() && dataHead.inMemory >= config.memoryThreshold) {
++ try {
++ String prefix = config.getTempFilePrefix();
++ String suffix = config.getTempFileSuffix();
++- File dir = config.getTempDir();
++- File tempFile = (dir == null)
++- ? File.createTempFile(prefix, suffix)
++- : File.createTempFile(prefix, suffix, dir);
++- LOGGER.fine("Created temp file = "+tempFile);
+++ File tempFile = TempFiles.createTempFile(prefix, suffix, config.getTempDir());
+++ // delete the temp file when VM exits as a last resort for file clean up
+++ tempFile.deleteOnExit();
+++ if (LOGGER.isLoggable(Level.FINE)) {
+++ LOGGER.log(Level.FINE, "Created temp file = {0}", tempFile);
+++ }
++ dataHead.dataFile = new DataFile(tempFile);
++- } catch(IOException ioe) {
+++ } catch (IOException ioe) {
++ throw new MIMEParsingException(ioe);
++ }
++
++ if (dataHead.head != null) {
++- for(Chunk c=dataHead.head; c != null; c=c.next) {
+++ for (Chunk c = dataHead.head; c != null; c = c.next) {
++ long pointer = c.data.writeTo(dataHead.dataFile);
++ c.data = new FileData(dataHead.dataFile, pointer, len);
++ }
++@@ -93,4 +98,5 @@
++ return new MemoryData(buf, config);
++ }
++ }
+++
++ }
++--- /dev/null
+++++ src/com/sun/xml/internal/org/jvnet/mimepull/TempFiles.java
++@@ -0,0 +1,144 @@
+++/*
+++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * This code is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License version 2 only, as
+++ * published by the Free Software Foundation. Oracle designates this
+++ * particular file as subject to the "Classpath" exception as provided
+++ * by Oracle in the LICENSE file that accompanied this code.
+++ *
+++ * This code is distributed in the hope that it will be useful, but WITHOUT
+++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+++ * version 2 for more details (a copy is included in the LICENSE file that
+++ * accompanied this code).
+++ *
+++ * You should have received a copy of the GNU General Public License version
+++ * 2 along with this work; if not, write to the Free Software Foundation,
+++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+++ *
+++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+++ * or visit www.oracle.com if you need additional information or have any
+++ * questions.
+++ */
+++
+++package com.sun.xml.internal.org.jvnet.mimepull;
+++
+++import java.io.File;
+++import java.io.IOException;
+++import java.lang.reflect.Array;
+++import java.lang.reflect.InvocationTargetException;
+++import java.lang.reflect.Method;
+++import java.util.logging.Level;
+++import java.util.logging.Logger;
+++
+++/**
+++ * Helper utility to support jdk <= jdk1.6. After jdk1.6 EOL reflection can be removed and API can be used directly.
+++ */
+++class TempFiles {
+++
+++ private static final Logger LOGGER = Logger.getLogger(TempFiles.class.getName());
+++
+++ private static final Class<?> CLASS_FILES;
+++ private static final Class<?> CLASS_PATH;
+++ private static final Class<?> CLASS_FILE_ATTRIBUTE;
+++ private static final Class<?> CLASS_FILE_ATTRIBUTES;
+++ private static final Method METHOD_FILE_TO_PATH;
+++ private static final Method METHOD_FILES_CREATE_TEMP_FILE;
+++ private static final Method METHOD_FILES_CREATE_TEMP_FILE_WITHPATH;
+++
+++ private static final Method METHOD_PATH_TO_FILE;
+++
+++ private static boolean useJdk6API;
+++
+++ static {
+++ useJdk6API = isJdk6();
+++
+++ CLASS_FILES = safeGetClass("java.nio.file.Files");
+++ CLASS_PATH = safeGetClass("java.nio.file.Path");
+++ CLASS_FILE_ATTRIBUTE = safeGetClass("java.nio.file.attribute.FileAttribute");
+++ CLASS_FILE_ATTRIBUTES = safeGetClass("[Ljava.nio.file.attribute.FileAttribute;");
+++ METHOD_FILE_TO_PATH = safeGetMethod(File.class, "toPath");
+++ METHOD_FILES_CREATE_TEMP_FILE = safeGetMethod(CLASS_FILES, "createTempFile", String.class, String.class, CLASS_FILE_ATTRIBUTES);
+++ METHOD_FILES_CREATE_TEMP_FILE_WITHPATH = safeGetMethod(CLASS_FILES, "createTempFile", CLASS_PATH, String.class, String.class, CLASS_FILE_ATTRIBUTES);
+++ METHOD_PATH_TO_FILE = safeGetMethod(CLASS_PATH, "toFile");
+++ }
+++
+++ private static boolean isJdk6() {
+++ String javaVersion = System.getProperty("java.version");
+++ LOGGER.log(Level.FINEST, "Detected java version = {0}", javaVersion);
+++ return javaVersion.startsWith("1.6.");
+++ }
+++
+++ private static Class<?> safeGetClass(String className) {
+++ // it is jdk 6 or something failed already before
+++ if (useJdk6API) return null;
+++ try {
+++ return Class.forName(className);
+++ } catch (ClassNotFoundException e) {
+++ LOGGER.log(Level.SEVERE, "Exception cought", e);
+++ LOGGER.log(Level.WARNING, "Class {0} not found. Temp files will be created using old java.io API.", className);
+++ useJdk6API = true;
+++ return null;
+++ }
+++ }
+++
+++ private static Method safeGetMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) {
+++ // it is jdk 6 or something failed already before
+++ if (useJdk6API) return null;
+++ try {
+++ return clazz.getMethod(methodName, parameterTypes);
+++ } catch (NoSuchMethodException e) {
+++ LOGGER.log(Level.SEVERE, "Exception cought", e);
+++ LOGGER.log(Level.WARNING, "Method {0} not found. Temp files will be created using old java.io API.", methodName);
+++ useJdk6API = true;
+++ return null;
+++ }
+++ }
+++
+++
+++ static Object toPath(File f) throws InvocationTargetException, IllegalAccessException {
+++ return METHOD_FILE_TO_PATH.invoke(f);
+++ }
+++
+++ static File toFile(Object path) throws InvocationTargetException, IllegalAccessException {
+++ return (File) METHOD_PATH_TO_FILE.invoke(path);
+++ }
+++
+++ static File createTempFile(String prefix, String suffix, File dir) throws IOException {
+++
+++ if (useJdk6API) {
+++ LOGGER.log(Level.FINEST, "Jdk6 detected, temp file (prefix:{0}, suffix:{1}) being created using old java.io API.", new Object[]{prefix, suffix});
+++ return File.createTempFile(prefix, suffix, dir);
+++
+++ } else {
+++
+++ try {
+++ if (dir != null) {
+++ Object path = toPath(dir);
+++ LOGGER.log(Level.FINEST, "Temp file (path: {0}, prefix:{1}, suffix:{2}) being created using NIO API.", new Object[]{dir.getAbsolutePath(), prefix, suffix});
+++ return toFile(METHOD_FILES_CREATE_TEMP_FILE_WITHPATH.invoke(null, path, prefix, suffix, Array.newInstance(CLASS_FILE_ATTRIBUTE, 0)));
+++ } else {
+++ LOGGER.log(Level.FINEST, "Temp file (prefix:{0}, suffix:{1}) being created using NIO API.", new Object[]{prefix, suffix});
+++ return toFile(METHOD_FILES_CREATE_TEMP_FILE.invoke(null, prefix, suffix, Array.newInstance(CLASS_FILE_ATTRIBUTE, 0)));
+++ }
+++
+++ } catch (IllegalAccessException e) {
+++ LOGGER.log(Level.SEVERE, "Exception caught", e);
+++ LOGGER.log(Level.WARNING, "Error invoking java.nio API, temp file (path: {0}, prefix:{1}, suffix:{2}) being created using old java.io API.",
+++ new Object[]{dir != null ? dir.getAbsolutePath() : null, prefix, suffix});
+++ return File.createTempFile(prefix, suffix, dir);
+++
+++ } catch (InvocationTargetException e) {
+++ LOGGER.log(Level.SEVERE, "Exception caught", e);
+++ LOGGER.log(Level.WARNING, "Error invoking java.nio API, temp file (path: {0}, prefix:{1}, suffix:{2}) being created using old java.io API.",
+++ new Object[]{dir != null ? dir.getAbsolutePath() : null, prefix, suffix});
+++ return File.createTempFile(prefix, suffix, dir);
+++ }
+++ }
+++
+++ }
+++
+++
+++}
diff --git a/java/openjdk6/files/icedtea/security/20130416/8004261.patch b/java/openjdk6/files/icedtea/security/20130416/8004261.patch
new file mode 100644
index 000000000000..245d49e34c5f
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8004261.patch
@@ -0,0 +1,142 @@
+# HG changeset patch
+# User andrew
+# Date 1365774039 -3600
+# Node ID 0236ab95a0f15e35aef6edd91f58a5072784dccd
+# Parent 8f5ad2cacf6fff8efd817c5373469037d945f3dc
+8004261: Improve input validation
+Reviewed-by: art, mschoene, amenkov
+
+diff --git a/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java b/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java
+--- jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java
++++ jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java
+@@ -56,7 +56,7 @@
+ // from simultaneous creation and destruction
+ // reduces possibility of deadlock, compared to
+ // synchronizing to the class instance
+- private Object traRecLock = new Object();
++ private final Object traRecLock = new Object();
+
+ // DEVICE ATTRIBUTES
+
+@@ -474,7 +474,7 @@
+ This is necessary for Receivers retrieved via MidiSystem.getReceiver()
+ (which opens the device implicitely).
+ */
+- protected abstract class AbstractReceiver implements Receiver {
++ abstract class AbstractReceiver implements Receiver {
+ private boolean open = true;
+
+
+@@ -483,24 +483,24 @@
+ Receiver. Therefore, subclasses should not override this method.
+ Instead, they should implement implSend().
+ */
+- public synchronized void send(MidiMessage message, long timeStamp) {
+- if (open) {
+- implSend(message, timeStamp);
+- } else {
++ @Override
++ public final synchronized void send(final MidiMessage message,
++ final long timeStamp) {
++ if (!open) {
+ throw new IllegalStateException("Receiver is not open");
+ }
++ implSend(message, timeStamp);
+ }
+
+-
+- protected abstract void implSend(MidiMessage message, long timeStamp);
+-
++ abstract void implSend(MidiMessage message, long timeStamp);
+
+ /** Close the Receiver.
+ * Here, the call to the magic method closeInternal() takes place.
+ * Therefore, subclasses that override this method must call
+ * 'super.close()'.
+ */
+- public void close() {
++ @Override
++ public final void close() {
+ open = false;
+ synchronized (AbstractMidiDevice.this.traRecLock) {
+ AbstractMidiDevice.this.getReceiverList().remove(this);
+@@ -508,7 +508,7 @@
+ AbstractMidiDevice.this.closeInternal(this);
+ }
+
+- protected boolean isOpen() {
++ final boolean isOpen() {
+ return open;
+ }
+
+diff --git a/src/share/classes/com/sun/media/sound/FastShortMessage.java b/src/share/classes/com/sun/media/sound/FastShortMessage.java
+--- jdk/src/share/classes/com/sun/media/sound/FastShortMessage.java
++++ jdk/src/share/classes/com/sun/media/sound/FastShortMessage.java
+@@ -32,7 +32,7 @@
+ *
+ * @author Florian Bomers
+ */
+-class FastShortMessage extends ShortMessage {
++final class FastShortMessage extends ShortMessage {
+ private int packedMsg;
+
+ public FastShortMessage(int packedMsg) throws InvalidMidiDataException {
+diff --git a/src/share/classes/com/sun/media/sound/FastSysexMessage.java b/src/share/classes/com/sun/media/sound/FastSysexMessage.java
+--- jdk/src/share/classes/com/sun/media/sound/FastSysexMessage.java
++++ jdk/src/share/classes/com/sun/media/sound/FastSysexMessage.java
+@@ -32,7 +32,7 @@
+ *
+ * @author Florian Bomers
+ */
+-class FastSysexMessage extends SysexMessage {
++final class FastSysexMessage extends SysexMessage {
+
+ FastSysexMessage(byte[] data) throws InvalidMidiDataException {
+ super(data);
+diff --git a/src/share/classes/com/sun/media/sound/MidiOutDevice.java b/src/share/classes/com/sun/media/sound/MidiOutDevice.java
+--- jdk/src/share/classes/com/sun/media/sound/MidiOutDevice.java
++++ jdk/src/share/classes/com/sun/media/sound/MidiOutDevice.java
+@@ -103,9 +103,9 @@
+
+ class MidiOutReceiver extends AbstractReceiver {
+
+- protected void implSend(MidiMessage message, long timeStamp) {
+- int length = message.getLength();
+- int status = message.getStatus();
++ void implSend(final MidiMessage message, final long timeStamp) {
++ final int length = message.getLength();
++ final int status = message.getStatus();
+ if (length <= 3 && status != 0xF0 && status != 0xF7) {
+ int packedMsg;
+ if (message instanceof ShortMessage) {
+@@ -140,11 +140,15 @@
+ }
+ nSendShortMessage(id, packedMsg, timeStamp);
+ } else {
++ final byte[] data;
+ if (message instanceof FastSysexMessage) {
+- nSendLongMessage(id, ((FastSysexMessage) message).getReadOnlyMessage(),
+- length, timeStamp);
++ data = ((FastSysexMessage) message).getReadOnlyMessage();
+ } else {
+- nSendLongMessage(id, message.getMessage(), length, timeStamp);
++ data = message.getMessage();
++ }
++ final int dataLength = Math.min(length, data.length);
++ if (dataLength > 0) {
++ nSendLongMessage(id, data, dataLength, timeStamp);
+ }
+ }
+ }
+diff --git a/src/share/classes/com/sun/media/sound/RealTimeSequencer.java b/src/share/classes/com/sun/media/sound/RealTimeSequencer.java
+--- jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java
++++ jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java
+@@ -1019,7 +1019,7 @@
+
+ class SequencerReceiver extends AbstractReceiver {
+
+- protected void implSend(MidiMessage message, long timeStamp) {
++ void implSend(MidiMessage message, long timeStamp) {
+ if (recording) {
+ long tickPos = 0;
+
diff --git a/java/openjdk6/files/icedtea/security/20130416/8004336.patch b/java/openjdk6/files/icedtea/security/20130416/8004336.patch
new file mode 100644
index 000000000000..ca0ab35188cc
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8004336.patch
@@ -0,0 +1,29 @@
+# HG changeset patch
+# User twisti
+# Date 1361822075 28800
+# Node ID cf2b7f0f7a2188a1421bdd033e88bf4b0aa6870c
+# Parent f9d5be4340c0ab09bebfcd2dce5563a2042ccc95
+8004336: Better handling of method handle intrinsic frames
+Reviewed-by: kvn, jrose, ahgross
+
+diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp
+--- hotspot/src/share/vm/opto/library_call.cpp
++++ hotspot/src/share/vm/opto/library_call.cpp
+@@ -1313,7 +1313,6 @@
+ push(result);
+ return true;
+ }
+-
+ //--------------------------pop_math_arg--------------------------------
+ // Pop a double argument to a math function from the stack
+ // rounding it if necessary.
+@@ -3746,7 +3745,8 @@
+ }
+ }
+ }
+- else if (method->is_method_handle_adapter()) {
++
++ if (method->is_method_handle_adapter()) {
+ // This is an internal adapter frame from the MethodHandleCompiler -- skip it
+ return true;
+ }
diff --git a/java/openjdk6/files/icedtea/security/20130416/8004986.patch b/java/openjdk6/files/icedtea/security/20130416/8004986.patch
new file mode 100644
index 000000000000..2139154d9d26
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8004986.patch
@@ -0,0 +1,374 @@
+# HG changeset patch
+# User andrew
+# Date 1365737071 -3600
+# Node ID c7ddbf756d7f35d6e782eb91b86ce2938de44fb8
+# Parent a5bbb8808ac9a6a8e20c5f267044bb0cef0bbdc1
+8004986: Better handling of glyph table
+8004987: Improve font layout
+8004994: Improve checking of glyph table
+Reviewed-by: bae, mschoene, jgodinez
+Contributed-by: steven.loomis@oracle.com
+
+diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp
+@@ -26,7 +26,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
+ *
+ */
+
+@@ -155,17 +155,16 @@
+ UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(
+ const LEFontInstance *fontInstance,
+ le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags)
+- : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
++ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG)
+ {
+ fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable;
+ fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+-
+- fSubstitutionFilter = new CharSubstitutionFilter(fontInstance);
++ /* OpenTypeLayoutEngine will allocate a substitution filter */
+ }
+
+ UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine()
+ {
+- delete fSubstitutionFilter;
++ /* OpenTypeLayoutEngine will cleanup the substitution filter */
+ }
+
+ // "glyphs", "indices" -> glyphs, indices
+diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h
+--- jdk/src/share/native/sun/font/layout/LETypes.h
++++ jdk/src/share/native/sun/font/layout/LETypes.h
+@@ -208,6 +208,35 @@
+ #define LE_CLIENT_SHIFT 24
+
+
++#ifndef LE_ASSERT_BAD_FONT
++#define LE_ASSERT_BAD_FONT 0
++#endif
++
++#if LE_ASSERT_BAD_FONT
++#include <stdio.h>
++#define LE_DEBUG_BAD_FONT(x) fprintf(stderr,"%s:%d: BAD FONT: %s\n", __FILE__, __LINE__, (x));
++#else
++#define LE_DEBUG_BAD_FONT(x)
++#endif
++
++/**
++ * Max value representable by a uintptr
++ */
++#ifndef UINTPTR_MAX
++#ifndef UINT32_MAX
++#define LE_UINTPTR_MAX 0xFFFFFFFFU
++#else
++#define LE_UINTPTR_MAX UINT32_MAX
++#endif
++#else
++#define LE_UINTPTR_MAX UINTPTR_MAX
++#endif
++
++/**
++ * Range check for overflow
++ */
++#define LE_RANGE_CHECK(type, count, ptrfn) (( (LE_UINTPTR_MAX / sizeof(type)) < count ) ? NULL : (ptrfn))
++
+ /**
+ * A convenience macro to get the Glyph ID part of an LEGlyphID.
+ *
+@@ -599,6 +628,21 @@
+ */
+ #define LE_SUCCESS(code) ((code)<=LE_NO_ERROR)
+
++enum LEFeatureENUMs {
++ LE_Kerning_FEATURE_ENUM = 0,
++ LE_Ligatures_FEATURE_ENUM = 1,
++ LE_CHAR_FILTER_FEATURE_ENUM = 31,
++};
++
++#define LE_Kerning_FEATURE_FLAG (1 << LE_Kerning_FEATURE_ENUM)
++#define LE_Ligatures_FEATURE_FLAG (1 << LE_Ligatures_FEATURE_ENUM)
++
++#define LE_CHAR_FILTER_FEATURE_ENUM 31
++
++#define LE_CHAR_FILTER_FEATURE_FLAG (1 << LE_CHAR_FILTER_FEATURE_ENUM)
++
++#define LE_DEFAULT_FEATURE_FLAG (LE_Kerning_FEATURE_FLAG | LE_Ligatures_FEATURE_FLAG) /**< default features */
++
+ /**
+ * A convenience macro to test for the failure of a LayoutEngine call.
+ *
+diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp
+@@ -31,6 +31,7 @@
+
+ #include "LETypes.h"
+ #include "LEScripts.h"
++#include "LESwaps.h"
+ #include "LELanguages.h"
+
+ #include "LayoutEngine.h"
+@@ -387,7 +388,7 @@
+
+ adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+
+- if (fTypoFlags & 0x1) { /* kerning enabled */
++ if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */
+ static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
+
+ KernTable kt(fFontInstance, getFontTable(kernTableTag));
+@@ -538,7 +539,7 @@
+ {
+ // 3 -> kerning and ligatures
+ return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode,
+- languageCode, 3, success);
++ languageCode, LE_DEFAULT_FEATURE_FLAG, success);
+ }
+
+ LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance,
+@@ -621,7 +622,7 @@
+ const MorphTableHeader *morphTable =
+ (MorphTableHeader *) fontInstance->getFontTable(mortTableTag);
+
+- if (morphTable != NULL) {
++ if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) {
+ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable);
+ } else {
+ switch (scriptCode) {
+diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.cpp b/src/share/native/sun/font/layout/LigatureSubstProc.cpp
+--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp
+@@ -25,7 +25,7 @@
+
+ /*
+ *
+- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
++ * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
+ *
+ */
+
+@@ -76,6 +76,10 @@
+ }
+
+ componentStack[m] = currGlyph;
++ } else if ( m == -1) {
++ // bad font- skip this glyph.
++ currGlyph++;
++ return newState;
+ }
+
+ ByteOffset actionOffset = flags & lsfActionOffsetMask;
+@@ -99,7 +103,21 @@
+ offset = action & lafComponentOffsetMask;
+ if (offset != 0) {
+ const le_int16 *offsetTable = (const le_int16 *)((char *) &ligatureSubstitutionHeader->stHeader + 2 * SignExtend(offset, lafComponentOffsetMask));
++ const le_int16 *tableEnd = (const le_int16 *)((char *) &ligatureSubstitutionHeader + 1 * SWAPW(ligatureSubstitutionHeader->length));
+
++ // Check if the font is internally consistent
++ if(tableEnd < (const le_int16*)&ligatureSubstitutionHeader // stated end wrapped around?
++ || offsetTable > tableEnd) { // offset past end of stated length?
++ currGlyph++;
++ LE_DEBUG_BAD_FONT("off end of ligature substitution header");
++ return newState; // get out! bad font
++ }
++
++ if(componentGlyph > glyphStorage.getGlyphCount()) {
++ LE_DEBUG_BAD_FONT("preposterous componentGlyph");
++ currGlyph++;
++ return newState; // get out! bad font
++ }
+ i += SWAPW(offsetTable[LE_GET_GLYPH(glyphStorage[componentGlyph])]);
+
+ if (action & (lafLast | lafStore)) {
+@@ -107,13 +125,22 @@
+ TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset);
+
+ glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph);
++ if(mm==nComponents) {
++ LE_DEBUG_BAD_FONT("exceeded nComponents");
++ mm--; // don't overrun the stack.
++ }
+ stack[++mm] = componentGlyph;
+ i = 0;
+ } else {
+ glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF);
+ }
+ }
+- } while (!(action & lafLast));
++#if LE_ASSERT_BAD_FONT
++ if(m<0) {
++ LE_DEBUG_BAD_FONT("m<0")
++ }
++#endif
++ } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
+
+ while (mm >= 0) {
+ if (++m >= nComponents) {
+diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
+@@ -185,7 +185,7 @@
+ lookupSelectCount = lookupListCount;
+
+ le_int32 count, order = 0;
+- le_int32 featureReferences = 0;
++ le_uint32 featureReferences = 0;
+ const FeatureTable *featureTable = NULL;
+ LETag featureTag;
+
+@@ -196,7 +196,7 @@
+ // be the maximum number of entries in the lookupOrderArray. We can't use
+ // lookupListCount because some lookups might be referenced by more than
+ // one feature.
+- for (le_int32 feature = 0; feature < featureCount; feature += 1) {
++ for (le_uint32 feature = 0; feature < featureCount; feature += 1) {
+ le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]);
+
+ featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag);
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp
+@@ -100,6 +100,14 @@
+ const GlyphPositioningTableHeader *gposTable =
+ (const GlyphPositioningTableHeader *) getFontTable(gposTableTag);
+
++ applyTypoFlags();
++
++}
++
++void OpenTypeLayoutEngine::applyTypoFlags() {
++ const le_int32& typoFlags = fTypoFlags;
++ const LEFontInstance *fontInstance = fFontInstance;
++
+ // todo: switch to more flags and bitfield rather than list of feature tags?
+ switch (typoFlags) {
+ case 0: break; // default
+@@ -109,13 +117,6 @@
+ default: break;
+ }
+
+- setScriptAndLanguageTags();
+-
+- fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag);
+-
+- if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) {
+- fGPOSTable = gposTable;
+- }
+ }
+
+ void OpenTypeLayoutEngine::reset()
+@@ -133,11 +134,16 @@
+ fFeatureOrder(FALSE), fGSUBTable(NULL), fGDEFTable(NULL),
+ fGPOSTable(NULL), fSubstitutionFilter(NULL)
+ {
++ applyTypoFlags();
+ setScriptAndLanguageTags();
+ }
+
+ OpenTypeLayoutEngine::~OpenTypeLayoutEngine()
+ {
++ if (fTypoFlags & LE_CHAR_FILTER_FEATURE_FLAG) {
++ delete fSubstitutionFilter;
++ fSubstitutionFilter = NULL;
++ }
+ reset();
+ }
+
+diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h
+@@ -150,6 +150,11 @@
+ */
+ static const LETag languageTags[];
+
++ /**
++ * apply the typoflags. Only called by the c'tors.
++ */
++ void applyTypoFlags();
++
+ protected:
+ /**
+ * A set of "default" features. The default characterProcessing method
+diff --git a/src/share/native/sun/font/layout/StateTableProcessor.cpp b/src/share/native/sun/font/layout/StateTableProcessor.cpp
+--- jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
+@@ -63,6 +63,9 @@
+
+ void StateTableProcessor::process(LEGlyphStorage &glyphStorage)
+ {
++
++ LE_STATE_PATIENCE_INIT();
++
+ // Start at state 0
+ // XXX: How do we know when to start at state 1?
+ ByteOffset currentState = stateArrayOffset;
+@@ -74,6 +77,7 @@
+ beginStateTable();
+
+ while (currGlyph <= glyphCount) {
++ if(LE_STATE_PATIENCE_DECR()) break; // patience exceeded.
+ ClassCode classCode = classCodeOOB;
+ if (currGlyph == glyphCount) {
+ // XXX: How do we handle EOT vs. EOL?
+@@ -90,8 +94,9 @@
+
+ const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState);
+ EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode];
+-
++ LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
+ currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex);
++ LE_STATE_PATIENCE_INCR(currGlyph);
+ }
+
+ endStateTable();
+diff --git a/src/share/native/sun/font/layout/StateTables.h b/src/share/native/sun/font/layout/StateTables.h
+--- jdk/src/share/native/sun/font/layout/StateTables.h
++++ jdk/src/share/native/sun/font/layout/StateTables.h
+@@ -35,6 +35,41 @@
+ #include "LETypes.h"
+ #include "LayoutTables.h"
+
++
++
++
++/*
++ * State table loop detection.
++ * Detects if too many ( LE_STATE_PATIENCE_COUNT ) state changes occur without moving the glyph index 'g'.
++ *
++ * Usage (pseudocode):
++ *
++ * {
++ * LE_STATE_PATIENCE_INIT();
++ *
++ * int g=0; // the glyph index - expect it to be moving
++ *
++ * for(;;) {
++ * if(LE_STATE_PATIENCE_DECR()) { // decrements the patience counter
++ * // ran out of patience, get out.
++ * break;
++ * }
++ *
++ * LE_STATE_PATIENCE_CURR(int, g); // store the 'current'
++ * state = newState(state,g);
++ * g+= <something, could be zero>;
++ * LE_STATE_PATIENCE_INCR(g); // if g has moved, increment the patience counter. Otherwise leave it.
++ * }
++ *
++ */
++
++#define LE_STATE_PATIENCE_COUNT 4096 /**< give up if a state table doesn't move the glyph after this many iterations */
++#define LE_STATE_PATIENCE_INIT() le_uint32 le_patience_count = LE_STATE_PATIENCE_COUNT
++#define LE_STATE_PATIENCE_DECR() --le_patience_count==0
++#define LE_STATE_PATIENCE_CURR(type,x) type le_patience_curr=(x)
++#define LE_STATE_PATIENCE_INCR(x) if((x)!=le_patience_curr) ++le_patience_count;
++
++
+ struct StateTableHeader
+ {
+ le_int16 stateSize;
diff --git a/java/openjdk6/files/icedtea/security/20130416/8005432.patch b/java/openjdk6/files/icedtea/security/20130416/8005432.patch
new file mode 100644
index 000000000000..ccb6093bdbfc
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8005432.patch
@@ -0,0 +1,511 @@
+--- jdk/src/share/lib/security/java.security 2013-04-16 14:57:04.075141879 +0100
++++ jdk/src/share/lib/security/java.security 2013-04-16 14:58:37.884647607 +0100
+@@ -128,10 +128,7 @@
+ # corresponding RuntimePermission ("accessClassInPackage."+package) has
+ # been granted.
+ package.access=sun.,\
+- com.sun.xml.internal.bind.,\
+- com.sun.xml.internal.org.jvnet.staxex.,\
+- com.sun.xml.internal.stream.,\
+- com.sun.xml.internal.ws.,\
++ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+@@ -164,10 +161,7 @@
+ # checkPackageDefinition.
+ #
+ package.definition=sun.,\
+- com.sun.xml.internal.bind.,\
+- com.sun.xml.internal.org.jvnet.staxex.,\
+- com.sun.xml.internal.stream.,\
+- com.sun.xml.internal.ws.,\
++ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+--- jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:57:04.075141879 +0100
++++ jdk/src/share/lib/security/java.security-solaris 2013-04-16 15:00:01.509990145 +0100
+@@ -129,10 +129,7 @@
+ # corresponding RuntimePermission ("accessClassInPackage."+package) has
+ # been granted.
+ package.access=sun.,\
+- com.sun.xml.internal.bind.,\
+- com.sun.xml.internal.org.jvnet.staxex.,\
+- com.sun.xml.internal.stream.,\
+- com.sun.xml.internal.ws.,\
++ com.sun.xml.internal.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+@@ -165,10 +162,7 @@
+ # checkPackageDefinition.
+ #
+ package.definition=sun.,\
+- com.sun.xml.internal.bind.,\
+- com.sun.xml.internal.org.jvnet.staxex.,\
+- com.sun.xml.internal.stream.,\
+- com.sun.xml.internal.ws.,\
++ com.sun.xml.internal.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+--- jdk/src/share/lib/security/java.security-windows 2013-04-16 14:57:04.075141879 +0100
++++ jdk/src/share/lib/security/java.security-windows 2013-04-16 15:00:24.790356811 +0100
+@@ -129,10 +129,7 @@
+ # corresponding RuntimePermission ("accessClassInPackage."+package) has
+ # been granted.
+ package.access=sun.,\
+- com.sun.xml.internal.bind.,\
+- com.sun.xml.internal.org.jvnet.staxex.,\
+- com.sun.xml.internal.stream.,\
+- com.sun.xml.internal.ws.,\
++ com.sun.xml.internal.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+@@ -165,10 +162,7 @@
+ # checkPackageDefinition.
+ #
+ package.definition=sun.,\
+- com.sun.xml.internal.bind.,\
+- com.sun.xml.internal.org.jvnet.staxex.,\
+- com.sun.xml.internal.stream.,\
+- com.sun.xml.internal.ws.,\
++ com.sun.xml.internal.,\
+ com.sun.imageio.
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+--- /dev/null 2013-04-25 15:02:13.000000000 -0400
++++ jaxws/patches/jaxws_src/8005432.patch 2013-04-25 15:09:37.000000000 -0400
+@@ -0,0 +1,430 @@
++--- src/com/sun/xml/internal/bind/v2/model/impl/ModelBuilder.java 2013-04-16 14:56:58.235048158 +0100
+++++ src/com/sun/xml/internal/bind/v2/model/impl/ModelBuilder.java 2013-04-16 14:58:37.884647607 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -235,7 +235,7 @@
++ String pkg = nav.getPackageName(ci.getClazz());
++ if(!registries.containsKey(pkg)) {
++ // insert the package's object factory
++- C c = nav.findClass(pkg + ".ObjectFactory",ci.getClazz());
+++ C c = loadObjectFactory(ci, pkg);
++ if(c!=null)
++ addRegistry(c,(Locatable)p);
++ }
++@@ -264,6 +264,15 @@
++ return r;
++ }
++
+++ private C loadObjectFactory(ClassInfoImpl<T, C, F, M> ci, String pkg) {
+++ try {
+++ return nav.findClass(pkg + ".ObjectFactory", ci.getClazz());
+++ } catch (SecurityException ignored) {
+++ // treat SecurityException in same way as ClassNotFoundException in this case
+++ return null;
+++ }
+++ }
+++
++ /**
++ * Checks the uniqueness of the type name.
++ */
++--- src/com/sun/xml/internal/ws/client/WSServiceDelegate.java 2013-04-16 14:56:58.419051111 +0100
+++++ src/com/sun/xml/internal/ws/client/WSServiceDelegate.java 2013-04-16 14:58:37.884647607 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -22,7 +22,6 @@
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++-
++ package com.sun.xml.internal.ws.client;
++
++ import com.sun.istack.internal.NotNull;
++@@ -45,8 +44,8 @@
++ import com.sun.xml.internal.ws.client.HandlerConfigurator.AnnotationConfigurator;
++ import com.sun.xml.internal.ws.client.HandlerConfigurator.HandlerResolverImpl;
++ import com.sun.xml.internal.ws.client.sei.SEIStub;
++-import com.sun.xml.internal.ws.developer.WSBindingProvider;
++ import com.sun.xml.internal.ws.developer.UsesJAXBContextFeature;
+++import com.sun.xml.internal.ws.developer.WSBindingProvider;
++ import com.sun.xml.internal.ws.model.AbstractSEIModelImpl;
++ import com.sun.xml.internal.ws.model.RuntimeModeler;
++ import com.sun.xml.internal.ws.model.SOAPSEIModel;
++@@ -59,7 +58,6 @@
++ import com.sun.xml.internal.ws.util.JAXWSUtils;
++ import com.sun.xml.internal.ws.util.ServiceConfigurationError;
++ import com.sun.xml.internal.ws.util.ServiceFinder;
++-import static com.sun.xml.internal.ws.util.xml.XmlUtil.createDefaultCatalogResolver;
++ import com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser;
++ import org.xml.sax.SAXException;
++
++@@ -74,16 +72,18 @@
++ import javax.xml.ws.handler.HandlerResolver;
++ import javax.xml.ws.soap.AddressingFeature;
++ import java.io.IOException;
+++import java.lang.RuntimePermission;
++ import java.lang.reflect.Proxy;
++ import java.net.MalformedURLException;
++ import java.net.URL;
++-import java.security.AccessController;
++-import java.security.PrivilegedAction;
+++import java.security.*;
++ import java.util.*;
++ import java.util.concurrent.Executor;
++ import java.util.concurrent.Executors;
++ import java.util.concurrent.ThreadFactory;
++
+++import static com.sun.xml.internal.ws.util.xml.XmlUtil.createDefaultCatalogResolver;
+++
++ /**
++ * <code>Service</code> objects provide the client view of a Web service.
++ *
++@@ -613,7 +613,7 @@
++ }
++ }
++
++- private <T> T createEndpointIFBaseProxy(@Nullable WSEndpointReference epr,QName portName, Class<T> portInterface,
+++ private <T> T createEndpointIFBaseProxy(@Nullable WSEndpointReference epr,QName portName, final Class<T> portInterface,
++ WebServiceFeature[] webServiceFeatures, SEIPortInfo eif) {
++ //fail if service doesnt have WSDL
++ if (wsdlService == null)
++@@ -627,14 +627,37 @@
++ BindingImpl binding = eif.createBinding(webServiceFeatures,portInterface);
++ SEIStub pis = new SEIStub(this, binding, eif.model, createPipeline(eif, binding), epr);
++
++- T proxy = portInterface.cast(Proxy.newProxyInstance(portInterface.getClassLoader(),
++- new Class[]{portInterface, WSBindingProvider.class, Closeable.class}, pis));
+++ T proxy = createProxy(portInterface, pis);
+++
++ if (serviceInterceptor != null) {
++ serviceInterceptor.postCreateProxy((WSBindingProvider)proxy, portInterface);
++ }
++ return proxy;
++ }
++
+++ private <T> T createProxy(final Class<T> portInterface, final SEIStub pis) {
+++
+++ // accessClassInPackage privilege needs to be granted ...
+++ RuntimePermission perm = new RuntimePermission("accessClassInPackage.com.sun." + "xml.internal.*");
+++ PermissionCollection perms = perm.newPermissionCollection();
+++ perms.add(perm);
+++
+++ return AccessController.doPrivileged(
+++ new PrivilegedAction<T>() {
+++ @Override
+++ public T run() {
+++ Object proxy = Proxy.newProxyInstance(portInterface.getClassLoader(),
+++ new Class[]{portInterface, WSBindingProvider.class, Closeable.class}, pis);
+++ return portInterface.cast(proxy);
+++ }
+++ },
+++ new AccessControlContext(
+++ new ProtectionDomain[]{
+++ new ProtectionDomain(null, perms)
+++ })
+++ );
+++ }
+++
++ /**
++ * Lists up the port names in WSDL. For error diagnostics.
++ */
++--- src/javax/xml/soap/FactoryFinder.java 2013-04-16 14:56:58.667055090 +0100
+++++ src/javax/xml/soap/FactoryFinder.java 2013-04-16 14:58:37.888647671 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -50,20 +50,12 @@
++ throws SOAPException
++ {
++ try {
++- Class spiClass;
++- if (classLoader == null) {
++- spiClass = Class.forName(className);
++- } else {
++- spiClass = classLoader.loadClass(className);
++- }
+++ Class spiClass = safeLoadClass(className, classLoader);
++ return spiClass.newInstance();
++ } catch (ClassNotFoundException x) {
++- throw new SOAPException(
++- "Provider " + className + " not found", x);
+++ throw new SOAPException("Provider " + className + " not found", x);
++ } catch (Exception x) {
++- throw new SOAPException(
++- "Provider " + className + " could not be instantiated: " + x,
++- x);
+++ throw new SOAPException("Provider " + className + " could not be instantiated: " + x, x);
++ }
++ }
++
++@@ -83,6 +75,61 @@
++ static Object find(String factoryId)
++ throws SOAPException
++ {
+++ return find(factoryId, null, false);
+++ }
+++
+++ /**
+++ * Finds the implementation <code>Class</code> object for the given
+++ * factory name, or if that fails, finds the <code>Class</code> object
+++ * for the given fallback class name. The arguments supplied must be
+++ * used in order. If using the first argument is successful, the second
+++ * one will not be used.
+++ * <P>
+++ * This method is package private so that this code can be shared.
+++ *
+++ * @return the <code>Class</code> object of the specified message factory;
+++ * may be <code>null</code>
+++ *
+++ * @param factoryId the name of the factory to find, which is
+++ * a system property
+++ * @param fallbackClassName the implementation class name, which is
+++ * to be used only if nothing else
+++ * is found; <code>null</code> to indicate that
+++ * there is no fallback class name
+++ * @exception SOAPException if there is a SOAP error
+++ */
+++ static Object find(String factoryId, String fallbackClassName)
+++ throws SOAPException
+++ {
+++ return find(factoryId, fallbackClassName, true);
+++ }
+++
+++ /**
+++ * Finds the implementation <code>Class</code> object for the given
+++ * factory name, or if that fails, finds the <code>Class</code> object
+++ * for the given default class name, but only if <code>tryFallback</code>
+++ * is <code>true</code>. The arguments supplied must be used in order
+++ * If using the first argument is successful, the second one will not
+++ * be used. Note the default class name may be needed even if fallback
+++ * is not to be attempted, so certain error conditions can be handled.
+++ * <P>
+++ * This method is package private so that this code can be shared.
+++ *
+++ * @return the <code>Class</code> object of the specified message factory;
+++ * may not be <code>null</code>
+++ *
+++ * @param factoryId the name of the factory to find, which is
+++ * a system property
+++ * @param defaultClassName the implementation class name, which is
+++ * to be used only if nothing else
+++ * is found; <code>null</code> to indicate
+++ * that there is no default class name
+++ * @param tryFallback whether to try the default class as a
+++ * fallback
+++ * @exception SOAPException if there is a SOAP error
+++ */
+++ static Object find(String factoryId, String defaultClassName,
+++ boolean tryFallback) throws SOAPException {
++ ClassLoader classLoader;
++ try {
++ classLoader = Thread.currentThread().getContextClassLoader();
++@@ -140,49 +187,56 @@
++ } catch( Exception ex ) {
++ }
++
++- return null;
+++ // If not found and fallback should not be tried, return a null result.
+++ if (!tryFallback)
+++ return null;
+++
+++ // We didn't find the class through the usual means so try the default
+++ // (built in) factory if specified.
+++ if (defaultClassName == null) {
+++ throw new SOAPException(
+++ "Provider for " + factoryId + " cannot be found", null);
+++ }
+++ return newInstance(defaultClassName, classLoader);
++ }
++
++ /**
++- * Finds the implementation <code>Class</code> object for the given
++- * factory name, or if that fails, finds the <code>Class</code> object
++- * for the given fallback class name. The arguments supplied must be
++- * used in order. If using the first argument is successful, the second
++- * one will not be used.
++- * <P>
++- * This method is package private so that this code can be shared.
++- *
++- * @return the <code>Class</code> object of the specified message factory;
++- * may not be <code>null</code>
++- *
++- * @param factoryId the name of the factory to find, which is
++- * a system property
++- * @param fallbackClassName the implementation class name, which is
++- * to be used only if nothing else
++- * is found; <code>null</code> to indicate that
++- * there is no fallback class name
++- * @exception SOAPException if there is a SOAP error
+++ * Loads the class, provided that the calling thread has an access to the
+++ * class being loaded. If this is the specified default factory class and it
+++ * is restricted by package.access we get a SecurityException and can do a
+++ * Class.forName() on it so it will be loaded by the bootstrap class loader.
++ */
++- static Object find(String factoryId, String fallbackClassName)
++- throws SOAPException
++- {
++-
++- Object obj = find(factoryId);
++- if (obj != null)
++- return obj;
+++ private static Class safeLoadClass(String className,
+++ ClassLoader classLoader)
+++ throws ClassNotFoundException {
+++ try {
+++ // make sure that the current thread has an access to the package of the given name.
+++ SecurityManager s = System.getSecurityManager();
+++ if (s != null) {
+++ int i = className.lastIndexOf('.');
+++ if (i != -1) {
+++ s.checkPackageAccess(className.substring(0, i));
+++ }
+++ }
++
++- ClassLoader classLoader;
++- try {
++- classLoader = Thread.currentThread().getContextClassLoader();
++- } catch (Exception x) {
++- throw new SOAPException(x.toString(), x);
++- }
+++ if (classLoader == null)
+++ return Class.forName(className);
+++ else
+++ return classLoader.loadClass(className);
+++ } catch (SecurityException se) {
+++ // (only) default implementation can be loaded
+++ // using bootstrap class loader ...
+++ if (isDefaultImplementation(className))
+++ return Class.forName(className);
++
++- if (fallbackClassName == null) {
++- throw new SOAPException(
++- "Provider for " + factoryId + " cannot be found", null);
+++ throw se;
++ }
+++ }
++
++- return newInstance(fallbackClassName, classLoader);
+++ private static boolean isDefaultImplementation(String className) {
+++ return MessageFactory.DEFAULT_MESSAGE_FACTORY.equals(className) ||
+++ SOAPFactory.DEFAULT_SOAP_FACTORY.equals(className) ||
+++ SOAPConnectionFactory.DEFAULT_SOAP_CONNECTION_FACTORY.equals(className) ||
+++ SAAJMetaFactory.DEFAULT_META_FACTORY_CLASS.equals(className);
++ }
++ }
++--- src/javax/xml/soap/MessageFactory.java 2013-04-16 14:56:58.667055090 +0100
+++++ src/javax/xml/soap/MessageFactory.java 2013-04-16 14:58:37.888647671 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -72,7 +72,7 @@
++ */
++ public abstract class MessageFactory {
++
++- static private final String DEFAULT_MESSAGE_FACTORY
+++ static final String DEFAULT_MESSAGE_FACTORY
++ = "com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl";
++
++ static private final String MESSAGE_FACTORY_PROPERTY
++@@ -105,11 +105,14 @@
++ public static MessageFactory newInstance()
++ throws SOAPException {
++ try {
++- MessageFactory factory = (MessageFactory)
++- FactoryFinder.find(MESSAGE_FACTORY_PROPERTY);
+++ MessageFactory factory = (MessageFactory) FactoryFinder.find(
+++ MESSAGE_FACTORY_PROPERTY,
+++ DEFAULT_MESSAGE_FACTORY,
+++ false);
++
++- if (factory != null)
+++ if (factory != null) {
++ return factory;
+++ }
++
++ return newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
++ } catch (Exception ex) {
++--- src/javax/xml/soap/SAAJMetaFactory.java 2013-04-16 14:56:58.667055090 +0100
+++++ src/javax/xml/soap/SAAJMetaFactory.java 2013-04-16 14:58:37.888647671 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -50,7 +50,7 @@
++ public abstract class SAAJMetaFactory {
++ static private final String META_FACTORY_CLASS_PROPERTY =
++ "javax.xml.soap.MetaFactory";
++- static private final String DEFAULT_META_FACTORY_CLASS =
+++ static final String DEFAULT_META_FACTORY_CLASS =
++ "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl";
++
++ /**
++--- src/javax/xml/soap/SOAPConnectionFactory.java 2013-04-16 14:56:58.667055090 +0100
+++++ src/javax/xml/soap/SOAPConnectionFactory.java 2013-04-16 14:58:37.888647671 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -44,7 +44,7 @@
++ * A constant representing the default value for a <code>SOAPConnection</code>
++ * object. The default is the point-to-point SOAP connection.
++ */
++- static private final String DEFAULT_SOAP_CONNECTION_FACTORY
+++ static final String DEFAULT_SOAP_CONNECTION_FACTORY
++ = "com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory";
++
++ /**
++--- src/javax/xml/soap/SOAPFactory.java 2013-04-16 14:56:58.671055155 +0100
+++++ src/javax/xml/soap/SOAPFactory.java 2013-04-16 14:58:37.888647671 +0100
++@@ -1,5 +1,5 @@
++ /*
++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++@@ -61,6 +61,12 @@
++ "javax.xml.soap.SOAPFactory";
++
++ /**
+++ * Class name of default <code>SOAPFactory</code> implementation.
+++ */
+++ static final String DEFAULT_SOAP_FACTORY
+++ = "com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl";
+++
+++ /**
++ * Creates a <code>SOAPElement</code> object from an existing DOM
++ * <code>Element</code>. If the DOM <code>Element</code> that is passed in
++ * as an argument is already a <code>SOAPElement</code> then this method
++@@ -262,7 +268,7 @@
++ throws SOAPException
++ {
++ try {
++- SOAPFactory factory = (SOAPFactory) FactoryFinder.find(SOAP_FACTORY_PROPERTY);
+++ SOAPFactory factory = (SOAPFactory) FactoryFinder.find(SOAP_FACTORY_PROPERTY, DEFAULT_SOAP_FACTORY, false);
++ if (factory != null)
++ return factory;
++ return newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
diff --git a/java/openjdk6/files/icedtea/security/20130416/8005943.patch b/java/openjdk6/files/icedtea/security/20130416/8005943.patch
new file mode 100644
index 000000000000..02188fb6f551
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8005943.patch
@@ -0,0 +1,202 @@
+# HG changeset patch
+# User andrew
+# Date 1365784383 -3600
+# Node ID dfa1c658a62a54dbcfa02e96c51af21a3cc71907
+# Parent 0938f449476b5c89ccb68f0c195a57a0e72e9dc4
+8005943: (process) Improved Runtime.exec
+Reviewed-by: alanb, ahgross
+
+diff --git a/src/share/classes/java/lang/ProcessBuilder.java b/src/share/classes/java/lang/ProcessBuilder.java
+--- jdk/src/share/classes/java/lang/ProcessBuilder.java
++++ jdk/src/share/classes/java/lang/ProcessBuilder.java
+@@ -27,6 +27,7 @@
+
+ import java.io.File;
+ import java.io.IOException;
++import java.security.AccessControlException;
+ import java.util.ArrayList;
+ import java.util.List;
+ import java.util.Map;
+@@ -459,8 +460,9 @@
+ String prog = cmdarray[0];
+
+ SecurityManager security = System.getSecurityManager();
+- if (security != null)
++ if (security != null) {
+ security.checkExec(prog);
++ }
+
+ String dir = directory == null ? null : directory.toString();
+
+@@ -470,13 +472,24 @@
+ dir,
+ redirectErrorStream);
+ } catch (IOException e) {
++ String exceptionInfo = ": " + e.getMessage();
++ Throwable cause = e;
++ if (security != null) {
++ // Can not disclose the fail reason for read-protected files.
++ try {
++ security.checkRead(prog);
++ } catch (AccessControlException ace) {
++ exceptionInfo = "";
++ cause = ace;
++ }
++ }
+ // It's much easier for us to create a high-quality error
+ // message than the low-level C code which found the problem.
+ throw new IOException(
+ "Cannot run program \"" + prog + "\""
+ + (dir == null ? "" : " (in directory \"" + dir + "\")")
+- + ": " + e.getMessage(),
+- e);
++ + exceptionInfo,
++ cause);
+ }
+ }
+ }
+diff --git a/src/windows/classes/java/lang/ProcessImpl.java b/src/windows/classes/java/lang/ProcessImpl.java
+--- jdk/src/windows/classes/java/lang/ProcessImpl.java
++++ jdk/src/windows/classes/java/lang/ProcessImpl.java
+@@ -47,6 +47,88 @@
+ return new ProcessImpl(cmdarray, envblock, dir, redirectErrorStream);
+ }
+
++ // We guarantee the only command file execution for implicit [cmd.exe] run.
++ // http://technet.microsoft.com/en-us/library/bb490954.aspx
++ private static final char CMD_BAT_ESCAPE[] = {' ', '\t', '<', '>', '&', '|', '^'};
++ private static final char WIN32_EXECUTABLE_ESCAPE[] = {' ', '\t', '<', '>'};
++
++ private static boolean isQuoted(boolean noQuotesInside, String arg,
++ String errorMessage) {
++ int lastPos = arg.length() - 1;
++ if (lastPos >=1 && arg.charAt(0) == '"' && arg.charAt(lastPos) == '"') {
++ // The argument has already been quoted.
++ if (noQuotesInside) {
++ if (arg.indexOf('"', 1) != lastPos) {
++ // There is ["] inside.
++ throw new IllegalArgumentException(errorMessage);
++ }
++ }
++ return true;
++ }
++ if (noQuotesInside) {
++ if (arg.indexOf('"') >= 0) {
++ // There is ["] inside.
++ throw new IllegalArgumentException(errorMessage);
++ }
++ }
++ return false;
++ }
++
++ private static boolean needsEscaping(boolean isCmdFile, String arg) {
++ // Switch off MS heuristic for internal ["].
++ // Please, use the explicit [cmd.exe] call
++ // if you need the internal ["].
++ // Example: "cmd.exe", "/C", "Extended_MS_Syntax"
++
++ // For [.exe] or [.com] file the unpaired/internal ["]
++ // in the argument is not a problem.
++ boolean argIsQuoted = isQuoted(isCmdFile, arg,
++ "Argument has embedded quote, use the explicit CMD.EXE call.");
++
++ if (!argIsQuoted) {
++ char testEscape[] = isCmdFile
++ ? CMD_BAT_ESCAPE
++ : WIN32_EXECUTABLE_ESCAPE;
++ for (int i = 0; i < testEscape.length; ++i) {
++ if (arg.indexOf(testEscape[i]) >= 0) {
++ return true;
++ }
++ }
++ }
++ return false;
++ }
++
++ private static String getExecutablePath(String path)
++ throws IOException
++ {
++ boolean pathIsQuoted = isQuoted(true, path,
++ "Executable name has embedded quote, split the arguments");
++
++ // Win32 CreateProcess requires path to be normalized
++ File fileToRun = new File(pathIsQuoted
++ ? path.substring(1, path.length() - 1)
++ : path);
++
++ // From the [CreateProcess] function documentation:
++ //
++ // "If the file name does not contain an extension, .exe is appended.
++ // Therefore, if the file name extension is .com, this parameter
++ // must include the .com extension. If the file name ends in
++ // a period (.) with no extension, or if the file name contains a path,
++ // .exe is not appended."
++ //
++ // "If the file name !does not contain a directory path!,
++ // the system searches for the executable file in the following
++ // sequence:..."
++ //
++ // In practice ANY non-existent path is extended by [.exe] extension
++ // in the [CreateProcess] funcion with the only exception:
++ // the path ends by (.)
++
++ return fileToRun.getPath();
++ }
++
++
+ private long handle = 0;
+ private FileDescriptor stdin_fd;
+ private FileDescriptor stdout_fd;
+@@ -61,30 +143,31 @@
+ boolean redirectErrorStream)
+ throws IOException
+ {
+- // Win32 CreateProcess requires cmd[0] to be normalized
+- cmd[0] = new File(cmd[0]).getPath();
++ // The [executablePath] is not quoted for any case.
++ String executablePath = getExecutablePath(cmd[0]);
++
++ // We need to extend the argument verification procedure
++ // to guarantee the only command file execution for implicit [cmd.exe]
++ // run.
++ String upPath = executablePath.toUpperCase();
++ boolean isCmdFile = (upPath.endsWith(".CMD") || upPath.endsWith(".BAT"));
+
+ StringBuilder cmdbuf = new StringBuilder(80);
+- for (int i = 0; i < cmd.length; i++) {
+- if (i > 0) {
+- cmdbuf.append(' ');
+- }
++
++ // Quotation protects from interpretation of the [path] argument as
++ // start of longer path with spaces. Quotation has no influence to
++ // [.exe] extension heuristic.
++ cmdbuf.append('"');
++ cmdbuf.append(executablePath);
++ cmdbuf.append('"');
++
++ for (int i = 1; i < cmd.length; i++) {
++ cmdbuf.append(' ');
+ String s = cmd[i];
+- if (s.indexOf(' ') >= 0 || s.indexOf('\t') >= 0) {
+- if (s.charAt(0) != '"') {
+- cmdbuf.append('"');
+- cmdbuf.append(s);
+- if (s.endsWith("\\")) {
+- cmdbuf.append("\\");
+- }
+- cmdbuf.append('"');
+- } else if (s.endsWith("\"")) {
+- /* The argument has already been quoted. */
+- cmdbuf.append(s);
+- } else {
+- /* Unmatched quote for the argument. */
+- throw new IllegalArgumentException();
+- }
++ if (needsEscaping(isCmdFile, s)) {
++ cmdbuf.append('"');
++ cmdbuf.append(s);
++ cmdbuf.append('"');
+ } else {
+ cmdbuf.append(s);
+ }
diff --git a/java/openjdk6/files/icedtea/security/20130416/8006309.patch b/java/openjdk6/files/icedtea/security/20130416/8006309.patch
new file mode 100644
index 000000000000..26c2ac56cb7f
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8006309.patch
@@ -0,0 +1,22 @@
+# HG changeset patch
+# User poonam
+# Date 1362616238 28800
+# Node ID ef36be1ae9bc7d061721f8890797e5d89c901846
+# Parent cf2b7f0f7a2188a1421bdd033e88bf4b0aa6870c
+8006309: More reliable control panel operation
+Summary: Added a comment in the dead Kernel code
+Reviewed-by: ahgross, sla, coleenp
+
+diff --git a/src/share/vm/runtime/thread.cpp b/src/share/vm/runtime/thread.cpp
+--- hotspot/src/share/vm/runtime/thread.cpp
++++ hotspot/src/share/vm/runtime/thread.cpp
+@@ -3416,6 +3416,9 @@
+ os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), name);
+ library = os::dll_load(buffer, ebuf, sizeof ebuf);
+ #ifdef KERNEL
++
++ // Dead code, KERNEL is never built in JDK7 or later. This code will be removed in a future update release.
++
+ // Download instrument dll
+ if (library == NULL && strcmp(name, "instrument") == 0) {
+ char *props = Arguments::get_kernel_properties();
diff --git a/java/openjdk6/files/icedtea/security/20130416/8006435.patch b/java/openjdk6/files/icedtea/security/20130416/8006435.patch
new file mode 100644
index 000000000000..fc2aa8d125c2
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8006435.patch
@@ -0,0 +1,76 @@
+# HG changeset patch
+# User andrew
+# Date 1365784460 -3600
+# Node ID e0803f17f824df0bbedf0dd03aa06938389b1b9f
+# Parent dfa1c658a62a54dbcfa02e96c51af21a3cc71907
+8006435: Improvements in JMX
+Summary: Improvements in JMX
+Reviewed-by: dfuchs, skoivu
+
+diff --git a/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java b/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
+--- jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
++++ jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -213,7 +213,6 @@
+
+ Object moi = null;
+
+-
+ // ------------------------------
+ // ------------------------------
+ Constructor cons = findConstructor(theClass, null);
+@@ -224,6 +223,7 @@
+ // Instantiate the new object
+ try {
+ ReflectUtil.checkPackageAccess(theClass);
++ ReflectUtil.ensureClassAccess(theClass);
+ moi= cons.newInstance();
+ } catch (InvocationTargetException e) {
+ // Wrap the exception.
+@@ -270,7 +270,6 @@
+ checkMBeanPermission(theClass, null, null, "instantiate");
+
+ // Instantiate the new object
+-
+ // ------------------------------
+ // ------------------------------
+ final Class[] tab;
+@@ -301,6 +300,7 @@
+ }
+ try {
+ ReflectUtil.checkPackageAccess(theClass);
++ ReflectUtil.ensureClassAccess(theClass);
+ moi = cons.newInstance(params);
+ }
+ catch (NoSuchMethodError error) {
+diff --git a/src/share/classes/sun/reflect/misc/ReflectUtil.java b/src/share/classes/sun/reflect/misc/ReflectUtil.java
+--- jdk/src/share/classes/sun/reflect/misc/ReflectUtil.java
++++ jdk/src/share/classes/sun/reflect/misc/ReflectUtil.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -46,6 +46,14 @@
+ return cls.newInstance();
+ }
+
++ public static void ensureClassAccess(Class clazz)
++ throws IllegalAccessException
++ {
++ int mod = clazz.getModifiers();
++ if ( ! Modifier.isPublic(mod) ){
++ throw new IllegalAccessException("Class is not public and can't be instantiated");
++ }
++ }
+ /*
+ * Reflection.ensureMemberAccess is overly-restrictive
+ * due to a bug. We awkwardly work around it for now.
diff --git a/java/openjdk6/files/icedtea/security/20130416/8006790.patch b/java/openjdk6/files/icedtea/security/20130416/8006790.patch
new file mode 100644
index 000000000000..b54d5230136c
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8006790.patch
@@ -0,0 +1,166 @@
+# HG changeset patch
+# User andrew
+# Date 1365784684 -3600
+# Node ID 08f7ab5f86a27c17b648f3b47f800393d939140c
+# Parent e0803f17f824df0bbedf0dd03aa06938389b1b9f
+8006790: Improve checking for windows
+Reviewed-by: art, mschoene
+
+diff --git a/src/share/classes/java/awt/Window.java b/src/share/classes/java/awt/Window.java
+--- jdk/src/share/classes/java/awt/Window.java
++++ jdk/src/share/classes/java/awt/Window.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -2055,7 +2055,7 @@
+ WindowPeer peer = (WindowPeer)this.peer;
+ synchronized(getTreeLock()) {
+ if (peer != null) {
+- peer.setAlwaysOnTop(alwaysOnTop);
++ peer.updateAlwaysOnTopState();
+ }
+ }
+ }
+diff --git a/src/share/classes/java/awt/peer/WindowPeer.java b/src/share/classes/java/awt/peer/WindowPeer.java
+--- jdk/src/share/classes/java/awt/peer/WindowPeer.java
++++ jdk/src/share/classes/java/awt/peer/WindowPeer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -37,7 +37,7 @@
+ public interface WindowPeer extends ContainerPeer {
+ void toFront();
+ void toBack();
+- void setAlwaysOnTop(boolean alwaysOnTop);
++ void updateAlwaysOnTopState();
+ void updateFocusableWindowState();
+ boolean requestWindowFocus();
+ void setModalBlocked(Dialog blocker, boolean blocked);
+diff --git a/src/share/classes/sun/awt/EmbeddedFrame.java b/src/share/classes/sun/awt/EmbeddedFrame.java
+--- jdk/src/share/classes/sun/awt/EmbeddedFrame.java
++++ jdk/src/share/classes/sun/awt/EmbeddedFrame.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -551,7 +551,7 @@
+ public void toBack() {}
+ public void updateFocusableWindowState() {}
+ public void updateAlwaysOnTop() {}
+- public void setAlwaysOnTop(boolean alwaysOnTop) {}
++ public void updateAlwaysOnTopState() {}
+ public Component getGlobalHeavyweightFocusOwner() { return null; }
+ public void setBoundsPrivate(int x, int y, int width, int height) {
+ setBounds(x, y, width, height, SET_BOUNDS);
+diff --git a/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/src/solaris/classes/sun/awt/X11/XWindowPeer.java
+--- jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java
++++ jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -1018,8 +1018,8 @@
+ XLayerProtocol.LAYER_NORMAL);
+ }
+
+- public void setAlwaysOnTop(boolean alwaysOnTop) {
+- this.alwaysOnTop = alwaysOnTop;
++ public void updateAlwaysOnTopState() {
++ this.alwaysOnTop = ((Window) this.target).isAlwaysOnTop();
+ updateAlwaysOnTop();
+ }
+
+diff --git a/src/windows/classes/sun/awt/windows/WFileDialogPeer.java b/src/windows/classes/sun/awt/windows/WFileDialogPeer.java
+--- jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java
++++ jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -199,7 +199,7 @@
+
+ // unused methods. Overridden to disable this functionality as
+ // it requires HWND which is not available for FileDialog
+- public void setAlwaysOnTop(boolean value) {}
++ public void updateAlwaysOnTopState() {}
+ public void setDirectory(String dir) {}
+ public void setFile(String file) {}
+ public void setTitle(String title) {}
+diff --git a/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java b/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java
+--- jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java
++++ jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -115,7 +115,7 @@
+ // unused methods. Overridden to disable this functionality as
+ // it requires HWND which is not available for FileDialog
+ void initialize() {}
+- public void setAlwaysOnTop(boolean b) {}
++ public void updateAlwaysOnTopState() {}
+ public void setResizable(boolean resizable) {}
+ public void hide() {}
+ public void enable() {}
+diff --git a/src/windows/classes/sun/awt/windows/WWindowPeer.java b/src/windows/classes/sun/awt/windows/WWindowPeer.java
+--- jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java
++++ jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -112,6 +112,10 @@
+ }
+ }
+
++ public void updateAlwaysOnTopState() {
++ setAlwaysOnTop(((Window)target).isAlwaysOnTop());
++ }
++
+ public void updateFocusableWindowState() {
+ setFocusableWindow(((Window)target).isFocusableWindow());
+ }
+# HG changeset patch
+# User andrew
+# Date 1365787780 -3600
+# Node ID f135ac267a382a052f563d7dd8fb001cd27827be
+# Parent 014d4beffa044a4ae8f7f82618bdf9bc659056a7
+Extend 8006790 to cover the Motif peer
+
+diff --git a/src/solaris/classes/sun/awt/motif/MWindowPeer.java b/src/solaris/classes/sun/awt/motif/MWindowPeer.java
+--- jdk/src/solaris/classes/sun/awt/motif/MWindowPeer.java
++++ jdk/src/solaris/classes/sun/awt/motif/MWindowPeer.java
+@@ -183,6 +183,10 @@
+ updateAlwaysOnTop(alwaysOnTop);
+ }
+
++ public void updateAlwaysOnTopState() {
++ setAlwaysOnTop(((Window)target).isAlwaysOnTop());
++ }
++
+ public void toFront() {
+ if (target.isVisible()) {
+ updateFocusableWindowState();
diff --git a/java/openjdk6/files/icedtea/security/20130416/8006795.patch b/java/openjdk6/files/icedtea/security/20130416/8006795.patch
new file mode 100644
index 000000000000..ec0d6bda9ac6
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8006795.patch
@@ -0,0 +1,35 @@
+# HG changeset patch
+# User prr
+# Date 1360268071 28800
+# Node ID 2da00862b3dba3b690f5e212a00fe984e9f648ed
+# Parent 08f7ab5f86a27c17b648f3b47f800393d939140c
+8006795: Improve font warning messages
+Reviewed-by: bae, jgodinez, mschoene
+
+diff --git a/src/share/classes/sun/font/CMap.java b/src/share/classes/sun/font/CMap.java
+--- jdk/src/share/classes/sun/font/CMap.java
++++ jdk/src/share/classes/sun/font/CMap.java
+@@ -841,7 +841,6 @@
+
+ CMapFormat6(ByteBuffer bbuffer, int offset, char[] xlat) {
+
+- System.err.println("WARNING: CMapFormat8 is untested.");
+ bbuffer.position(offset+6);
+ CharBuffer buffer = bbuffer.asCharBuffer();
+ firstCode = buffer.get();
+@@ -884,7 +883,6 @@
+
+ CMapFormat8(ByteBuffer bbuffer, int offset, char[] xlat) {
+
+- System.err.println("WARNING: CMapFormat8 is untested.");
+ bbuffer.position(12);
+ bbuffer.get(is32);
+ nGroups = bbuffer.getInt();
+@@ -915,7 +913,6 @@
+
+ CMapFormat10(ByteBuffer bbuffer, int offset, char[] xlat) {
+
+- System.err.println("WARNING: CMapFormat10 is untested.");
+ firstCode = bbuffer.getInt() & INTMASK;
+ entryCount = bbuffer.getInt() & INTMASK;
+ bbuffer.position(offset+20);
diff --git a/java/openjdk6/files/icedtea/security/20130416/8007406.patch b/java/openjdk6/files/icedtea/security/20130416/8007406.patch
new file mode 100644
index 000000000000..4d4ff7df7537
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8007406.patch
@@ -0,0 +1,31 @@
+# HG changeset patch
+# User raginip
+# Date 1362146770 0
+# Node ID 014d4beffa044a4ae8f7f82618bdf9bc659056a7
+# Parent 2da00862b3dba3b690f5e212a00fe984e9f648ed
+8007406: Improve accessibility of AccessBridge
+Reviewed-by: skoivu, mullan, ptbrunet
+
+diff --git a/src/share/lib/security/java.security-windows b/src/share/lib/security/java.security-windows
+--- jdk/src/share/lib/security/java.security-windows
++++ jdk/src/share/lib/security/java.security-windows
+@@ -149,7 +149,8 @@
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+- com.sun.org.glassfish.
++ com.sun.org.glassfish.,\
++ com.sun.java.accessibility.
+
+ #
+ # List of comma-separated packages that start with or equal this string
+@@ -182,7 +183,8 @@
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+- com.sun.org.glassfish.
++ com.sun.org.glassfish.,\
++ com.sun.java.accessibility.
+
+ #
+ # Determines whether this properties file can be appended to
diff --git a/java/openjdk6/files/icedtea/security/20130416/8007617.patch b/java/openjdk6/files/icedtea/security/20130416/8007617.patch
new file mode 100644
index 000000000000..452ef78c09ff
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8007617.patch
@@ -0,0 +1,376 @@
+# HG changeset patch
+# User bae
+# Date 1361531665 -14400
+# Node ID cf93d3828aa8f85003f3668f069646205c39c087
+# Parent ddd9e6df700fa59366b4560e58a3b7b0a16b4746
+8007617: Better validation of images
+Reviewed-by: prr, jgodinez
+
+diff --git openjdk/jdk/src/share/classes/sun/awt/image/ImageRepresentation.java openjdk/jdk/src/share/classes/sun/awt/image/ImageRepresentation.java
+--- jdk/src/share/classes/sun/awt/image/ImageRepresentation.java
++++ jdk/src/share/classes/sun/awt/image/ImageRepresentation.java
+@@ -333,10 +333,10 @@ public class ImageRepresentation extends
+ hints = h;
+ }
+
+- private native void setICMpixels(int x, int y, int w, int h, int[] lut,
++ private native boolean setICMpixels(int x, int y, int w, int h, int[] lut,
+ byte[] pix, int off, int scansize,
+ IntegerComponentRaster ict);
+- private native int setDiffICM(int x, int y, int w, int h, int[] lut,
++ private native boolean setDiffICM(int x, int y, int w, int h, int[] lut,
+ int transPix, int numLut, IndexColorModel icm,
+ byte[] pix, int off, int scansize,
+ ByteComponentRaster bct, int chanOff);
+@@ -426,10 +426,10 @@ public class ImageRepresentation extends
+ IndexColorModel icm = (IndexColorModel) model;
+ ByteComponentRaster bct = (ByteComponentRaster) biRaster;
+ int numlut = numSrcLUT;
+- if (setDiffICM(x, y, w, h, srcLUT, srcLUTtransIndex,
++ if (!setDiffICM(x, y, w, h, srcLUT, srcLUTtransIndex,
+ numSrcLUT, icm,
+ pix, off, scansize, bct,
+- bct.getDataOffset(0)) == 0) {
++ bct.getDataOffset(0))) {
+ convertToRGB();
+ }
+ else {
+@@ -470,9 +470,14 @@ public class ImageRepresentation extends
+ if (s_useNative) {
+ // Note that setICMpixels modifies the raster directly
+ // so we must mark it as changed afterwards
+- setICMpixels(x, y, w, h, srcLUT, pix, off, scansize,
+- iraster);
+- iraster.markDirty();
++ if (setICMpixels(x, y, w, h, srcLUT, pix, off, scansize,
++ iraster))
++ {
++ iraster.markDirty();
++ } else {
++ abort();
++ return;
++ }
+ }
+ else {
+ int[] storage = new int[w*h];
+diff --git openjdk/jdk/src/share/native/sun/awt/image/awt_ImageRep.c openjdk/jdk/src/share/native/sun/awt/image/awt_ImageRep.c
+--- jdk/src/share/native/sun/awt/image/awt_ImageRep.c
++++ jdk/src/share/native/sun/awt/image/awt_ImageRep.c
+@@ -45,6 +45,53 @@ static int findIdx(unsigned int rgb, uns
+ # define TRUE 1
+ #endif
+
++#define CHECK_STRIDE(yy, hh, ss) \
++ if ((ss) != 0) { \
++ int limit = 0x7fffffff / ((ss) > 0 ? (ss) : -(ss)); \
++ if (limit < (yy) || limit < ((yy) + (hh) - 1)) { \
++ /* integer oveflow */ \
++ return JNI_FALSE; \
++ } \
++ } \
++
++#define CHECK_SRC() \
++ do { \
++ int pixeloffset; \
++ if (off < 0 || off >= srcDataLength) { \
++ return JNI_FALSE; \
++ } \
++ CHECK_STRIDE(0, h, scansize); \
++ \
++ /* check scansize */ \
++ pixeloffset = scansize * (h - 1); \
++ if ((w - 1) > (0x7fffffff - pixeloffset)) { \
++ return JNI_FALSE; \
++ } \
++ pixeloffset += (w - 1); \
++ \
++ if (off > (0x7fffffff - pixeloffset)) { \
++ return JNI_FALSE; \
++ } \
++ } while (0) \
++
++#define CHECK_DST(xx, yy) \
++ do { \
++ int soffset = (yy) * sStride; \
++ int poffset = (xx) * pixelStride; \
++ if (poffset > (0x7fffffff - soffset)) { \
++ return JNI_FALSE; \
++ } \
++ poffset += soffset; \
++ if (dstDataOff > (0x7fffffff - poffset)) { \
++ return JNI_FALSE; \
++ } \
++ poffset += dstDataOff; \
++ \
++ if (poffset < 0 || poffset >= dstDataLength) { \
++ return JNI_FALSE; \
++ } \
++ } while (0) \
++
+ static jfieldID s_JnumSrcLUTID;
+ static jfieldID s_JsrcLUTtransIndexID;
+
+@@ -58,7 +105,7 @@ Java_sun_awt_image_ImageRepresentation_i
+ /*
+ * This routine is used to draw ICM pixels into a default color model
+ */
+-JNIEXPORT void JNICALL
++JNIEXPORT jboolean JNICALL
+ Java_sun_awt_image_ImageRepresentation_setICMpixels(JNIEnv *env, jclass cls,
+ jint x, jint y, jint w,
+ jint h, jintArray jlut,
+@@ -67,7 +114,10 @@ Java_sun_awt_image_ImageRepresentation_s
+ jobject jict)
+ {
+ unsigned char *srcData = NULL;
++ jint srcDataLength;
+ int *dstData;
++ jint dstDataLength;
++ jint dstDataOff;
+ int *dstP, *dstyP;
+ unsigned char *srcyP, *srcP;
+ int *srcLUT = NULL;
+@@ -80,12 +130,20 @@ Java_sun_awt_image_ImageRepresentation_s
+
+ if (JNU_IsNull(env, jlut)) {
+ JNU_ThrowNullPointerException(env, "NullPointerException");
+- return;
++ return JNI_FALSE;
+ }
+
+ if (JNU_IsNull(env, jpix)) {
+ JNU_ThrowNullPointerException(env, "NullPointerException");
+- return;
++ return JNI_FALSE;
++ }
++
++ if (x < 0 || w < 1 || (0x7fffffff - x) < w) {
++ return JNI_FALSE;
++ }
++
++ if (y < 0 || h < 1 || (0x7fffffff - y) < h) {
++ return JNI_FALSE;
+ }
+
+ sStride = (*env)->GetIntField(env, jict, g_ICRscanstrID);
+@@ -93,10 +151,47 @@ Java_sun_awt_image_ImageRepresentation_s
+ joffs = (*env)->GetObjectField(env, jict, g_ICRdataOffsetsID);
+ jdata = (*env)->GetObjectField(env, jict, g_ICRdataID);
+
++ if (JNU_IsNull(env, jdata)) {
++ /* no destination buffer */
++ return JNI_FALSE;
++ }
++
++ if (JNU_IsNull(env, joffs) || (*env)->GetArrayLength(env, joffs) < 1) {
++ /* invalid data offstes in raster */
++ return JNI_FALSE;
++ }
++
++ srcDataLength = (*env)->GetArrayLength(env, jpix);
++ dstDataLength = (*env)->GetArrayLength(env, jdata);
++
++ cOffs = (int *) (*env)->GetPrimitiveArrayCritical(env, joffs, NULL);
++ if (cOffs == NULL) {
++ JNU_ThrowNullPointerException(env, "Null channel offset array");
++ return JNI_FALSE;
++ }
++
++ dstDataOff = cOffs[0];
++
++ /* the offset array is not needed anymore and can be released */
++ (*env)->ReleasePrimitiveArrayCritical(env, joffs, cOffs, JNI_ABORT);
++ joffs = NULL;
++ cOffs = NULL;
++
++ /* do basic validation: make sure that offsets for
++ * first pixel and for last pixel are safe to calculate and use */
++ CHECK_STRIDE(y, h, sStride);
++ CHECK_STRIDE(x, w, pixelStride);
++
++ CHECK_DST(x, y);
++ CHECK_DST(x + w -1, y + h - 1);
++
++ /* check source array */
++ CHECK_SRC();
++
+ srcLUT = (int *) (*env)->GetPrimitiveArrayCritical(env, jlut, NULL);
+ if (srcLUT == NULL) {
+ JNU_ThrowNullPointerException(env, "Null IndexColorModel LUT");
+- return;
++ return JNI_FALSE;
+ }
+
+ srcData = (unsigned char *) (*env)->GetPrimitiveArrayCritical(env, jpix,
+@@ -104,27 +199,18 @@ Java_sun_awt_image_ImageRepresentation_s
+ if (srcData == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT);
+ JNU_ThrowNullPointerException(env, "Null data array");
+- return;
+- }
+-
+- cOffs = (int *) (*env)->GetPrimitiveArrayCritical(env, joffs, NULL);
+- if (cOffs == NULL) {
+- (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT);
+- (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+- JNU_ThrowNullPointerException(env, "Null channel offset array");
+- return;
++ return JNI_FALSE;
+ }
+
+ dstData = (int *) (*env)->GetPrimitiveArrayCritical(env, jdata, NULL);
+ if (dstData == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+- (*env)->ReleasePrimitiveArrayCritical(env, joffs, cOffs, JNI_ABORT);
+ JNU_ThrowNullPointerException(env, "Null tile data array");
+- return;
++ return JNI_FALSE;
+ }
+
+- dstyP = dstData + cOffs[0] + y*sStride + x*pixelStride;
++ dstyP = dstData + dstDataOff + y*sStride + x*pixelStride;
+ srcyP = srcData + off;
+ for (yIdx = 0; yIdx < h; yIdx++, srcyP += scansize, dstyP+=sStride) {
+ srcP = srcyP;
+@@ -137,12 +223,12 @@ Java_sun_awt_image_ImageRepresentation_s
+ /* Release the locked arrays */
+ (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+- (*env)->ReleasePrimitiveArrayCritical(env, joffs, cOffs, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, jdata, dstData, JNI_ABORT);
+
++ return JNI_TRUE;
+ }
+
+-JNIEXPORT jint JNICALL
++JNIEXPORT jboolean JNICALL
+ Java_sun_awt_image_ImageRepresentation_setDiffICM(JNIEnv *env, jclass cls,
+ jint x, jint y, jint w,
+ jint h, jintArray jlut,
+@@ -150,7 +236,7 @@ Java_sun_awt_image_ImageRepresentation_s
+ jobject jicm,
+ jbyteArray jpix, jint off,
+ jint scansize,
+- jobject jbct, jint chanOff)
++ jobject jbct, jint dstDataOff)
+ {
+ unsigned int *srcLUT = NULL;
+ unsigned int *newLUT = NULL;
+@@ -159,6 +245,8 @@ Java_sun_awt_image_ImageRepresentation_s
+ int mapSize;
+ jobject jdata = NULL;
+ jobject jnewlut = NULL;
++ jint srcDataLength;
++ jint dstDataLength;
+ unsigned char *srcData;
+ unsigned char *dstData;
+ unsigned char *dataP;
+@@ -174,13 +262,22 @@ Java_sun_awt_image_ImageRepresentation_s
+
+ if (JNU_IsNull(env, jlut)) {
+ JNU_ThrowNullPointerException(env, "NullPointerException");
+- return 0;
++ return JNI_FALSE;
+ }
+
+ if (JNU_IsNull(env, jpix)) {
+ JNU_ThrowNullPointerException(env, "NullPointerException");
+- return 0;
++ return JNI_FALSE;
+ }
++
++ if (x < 0 || w < 1 || (0x7fffffff - x) < w) {
++ return JNI_FALSE;
++ }
++
++ if (y < 0 || h < 1 || (0x7fffffff - y) < h) {
++ return JNI_FALSE;
++ }
++
+
+ sStride = (*env)->GetIntField(env, jbct, g_BCRscanstrID);
+ pixelStride =(*env)->GetIntField(env, jbct, g_BCRpixstrID);
+@@ -193,14 +290,31 @@ Java_sun_awt_image_ImageRepresentation_s
+ of byte data type, so we have to convert the image data
+ to default representation.
+ */
+- return 0;
++ return JNI_FALSE;
+ }
+
++ if (JNU_IsNull(env, jdata)) {
++ /* no destination buffer */
++ return JNI_FALSE;
++ }
++
++ srcDataLength = (*env)->GetArrayLength(env, jpix);
++ dstDataLength = (*env)->GetArrayLength(env, jdata);
++
++ CHECK_STRIDE(y, h, sStride);
++ CHECK_STRIDE(x, w, pixelStride);
++
++ CHECK_DST(x, y);
++ CHECK_DST(x + w -1, y + h - 1);
++
++ /* check source array */
++ CHECK_SRC();
++
+ srcLUT = (unsigned int *) (*env)->GetPrimitiveArrayCritical(env, jlut,
+ NULL);
+ if (srcLUT == NULL) {
+ /* out of memory error already thrown */
+- return 0;
++ return JNI_FALSE;
+ }
+
+ newLUT = (unsigned int *) (*env)->GetPrimitiveArrayCritical(env, jnewlut,
+@@ -208,7 +323,7 @@ Java_sun_awt_image_ImageRepresentation_s
+ (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT,
+ JNI_ABORT);
+ /* out of memory error already thrown */
+- return 0;
++ return JNI_FALSE;
+ }
+
+ newNumLut = numLut;
+@@ -219,7 +334,7 @@ Java_sun_awt_image_ImageRepresentation_s
+ (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT,
+ JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, jnewlut, newLUT, JNI_ABORT);
+- return 0;
++ return JNI_FALSE;
+ }
+
+ /* Don't need these any more */
+@@ -239,7 +354,7 @@ Java_sun_awt_image_ImageRepresentation_s
+ NULL);
+ if (srcData == NULL) {
+ /* out of memory error already thrown */
+- return 0;
++ return JNI_FALSE;
+ }
+
+ dstData = (unsigned char *) (*env)->GetPrimitiveArrayCritical(env, jdata,
+@@ -247,10 +362,10 @@ Java_sun_awt_image_ImageRepresentation_s
+ if (dstData == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+ /* out of memory error already thrown */
+- return 0;
++ return JNI_FALSE;
+ }
+
+- ydataP = dstData + chanOff + y*sStride + x*pixelStride;
++ ydataP = dstData + dstDataOff + y*sStride + x*pixelStride;
+ ypixP = srcData + off;
+
+ for (i=0; i < h; i++) {
+@@ -268,7 +383,7 @@ Java_sun_awt_image_ImageRepresentation_s
+ (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, jdata, dstData, JNI_ABORT);
+
+- return 1;
++ return JNI_TRUE;
+ }
+
+ static int compareLUTs(unsigned int *lut1, int numLut1, int transIdx,
diff --git a/java/openjdk6/files/icedtea/security/20130416/8007667.patch b/java/openjdk6/files/icedtea/security/20130416/8007667.patch
new file mode 100644
index 000000000000..132760bf08ea
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8007667.patch
@@ -0,0 +1,579 @@
+# HG changeset patch
+# User bae
+# Date 1361823317 -14400
+# Node ID d868fe7c7618e5b55eea8dd69ee5d099c71816e0
+# Parent 6784c9903db7f65a93279ac12b7fc00c57dbaaa5
+8007667: Better image reading
+Reviewed-by: prr, jgodinez
+
+diff --git openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
+--- jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
++++ jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
+@@ -281,12 +281,17 @@
+ * sending warnings to listeners.
+ */
+ protected void warningOccurred(int code) {
+- if ((code < 0) || (code > MAX_WARNING)){
+- throw new InternalError("Invalid warning index");
+- }
+- processWarningOccurred
+- ("com.sun.imageio.plugins.jpeg.JPEGImageReaderResources",
+- Integer.toString(code));
++ cbLock.lock();
++ try {
++ if ((code < 0) || (code > MAX_WARNING)){
++ throw new InternalError("Invalid warning index");
++ }
++ processWarningOccurred
++ ("com.sun.imageio.plugins.jpeg.JPEGImageReaderResources",
++ Integer.toString(code));
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ /**
+@@ -303,7 +308,12 @@
+ * library warnings from being printed to stderr.
+ */
+ protected void warningWithMessage(String msg) {
+- processWarningOccurred(msg);
++ cbLock.lock();
++ try {
++ processWarningOccurred(msg);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ public void setInput(Object input,
+@@ -312,18 +322,55 @@
+ {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ super.setInput(input, seekForwardOnly, ignoreMetadata);
+ this.ignoreMetadata = ignoreMetadata;
+ resetInternalState();
+ iis = (ImageInputStream) input; // Always works
+- setSource(structPointer, iis);
++ setSource(structPointer);
+ } finally {
+ clearThreadLock();
+ }
+ }
+
+- private native void setSource(long structPointer,
+- ImageInputStream source);
++ /**
++ * This method is called from native code in order to fill
++ * native input buffer.
++ *
++ * We block any attempt to change the reading state during this
++ * method, in order to prevent a corruption of the native decoder
++ * state.
++ *
++ * @return number of bytes read from the stream.
++ */
++ private int readInputData(byte[] buf, int off, int len) throws IOException {
++ cbLock.lock();
++ try {
++ return iis.read(buf, off, len);
++ } finally {
++ cbLock.unlock();
++ }
++ }
++
++ /**
++ * This method is called from the native code in order to
++ * skip requested number of bytes in the input stream.
++ *
++ * @param n
++ * @return
++ * @throws IOException
++ */
++ private long skipInputBytes(long n) throws IOException {
++ cbLock.lock();
++ try {
++ return iis.skipBytes(n);
++ } finally {
++ cbLock.unlock();
++ }
++ }
++
++ private native void setSource(long structPointer);
+
+ private void checkTablesOnly() throws IOException {
+ if (debug) {
+@@ -375,6 +422,8 @@
+ public int getNumImages(boolean allowSearch) throws IOException {
+ setThreadLock();
+ try { // locked thread
++ cbLock.check();
++
+ return getNumImagesOnThread(allowSearch);
+ } finally {
+ clearThreadLock();
+@@ -574,8 +623,13 @@
+ if (debug) {
+ System.out.println("pushing back " + num + " bytes");
+ }
+- iis.seek(iis.getStreamPosition()-num);
+- // The buffer is clear after this, so no need to set haveSeeked.
++ cbLock.lock();
++ try {
++ iis.seek(iis.getStreamPosition()-num);
++ // The buffer is clear after this, so no need to set haveSeeked.
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ /**
+@@ -645,7 +699,12 @@
+ * Ignore this profile.
+ */
+ iccCS = null;
+- warningOccurred(WARNING_IGNORE_INVALID_ICC);
++ cbLock.lock();
++ try {
++ warningOccurred(WARNING_IGNORE_INVALID_ICC);
++ } finally {
++ cbLock.unlock();
++ }
+
+ return;
+ }
+@@ -680,6 +739,7 @@
+ setThreadLock();
+ try {
+ if (currentImage != imageIndex) {
++ cbLock.check();
+ readHeader(imageIndex, true);
+ }
+ return width;
+@@ -692,6 +752,7 @@
+ setThreadLock();
+ try {
+ if (currentImage != imageIndex) {
++ cbLock.check();
+ readHeader(imageIndex, true);
+ }
+ return height;
+@@ -720,6 +781,8 @@
+ setThreadLock();
+ try {
+ if (currentImage != imageIndex) {
++ cbLock.check();
++
+ readHeader(imageIndex, true);
+ }
+
+@@ -743,6 +806,7 @@
+ private Iterator getImageTypesOnThread(int imageIndex)
+ throws IOException {
+ if (currentImage != imageIndex) {
++ cbLock.check();
+ readHeader(imageIndex, true);
+ }
+
+@@ -944,6 +1008,7 @@
+ setThreadLock();
+ try {
+ if (!tablesOnlyChecked) {
++ cbLock.check();
+ checkTablesOnly();
+ }
+ return streamMetadata;
+@@ -964,6 +1029,8 @@
+ return imageMetadata;
+ }
+
++ cbLock.check();
++
+ gotoImage(imageIndex);
+
+ imageMetadata = new JPEGMetadata(false, false, iis, this);
+@@ -980,6 +1047,7 @@
+ throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
+ try {
+ readInternal(imageIndex, param, false);
+ } catch (RuntimeException e) {
+@@ -1209,58 +1277,63 @@
+ }
+ target.setRect(destROI.x, destROI.y + y, raster);
+
+- processImageUpdate(image,
+- destROI.x, destROI.y+y,
+- raster.getWidth(), 1,
+- 1, 1,
+- destinationBands);
+- if ((y > 0) && (y%progInterval == 0)) {
+- int height = target.getHeight()-1;
+- float percentOfPass = ((float)y)/height;
+- if (progressive) {
+- if (knownPassCount != UNKNOWN) {
+- processImageProgress((pass + percentOfPass)*100.0F
+- / knownPassCount);
+- } else if (maxProgressivePass != Integer.MAX_VALUE) {
+- // Use the range of allowed progressive passes
+- processImageProgress((pass + percentOfPass)*100.0F
+- / (maxProgressivePass - minProgressivePass + 1));
++ cbLock.lock();
++ try {
++ processImageUpdate(image,
++ destROI.x, destROI.y+y,
++ raster.getWidth(), 1,
++ 1, 1,
++ destinationBands);
++ if ((y > 0) && (y%progInterval == 0)) {
++ int height = target.getHeight()-1;
++ float percentOfPass = ((float)y)/height;
++ if (progressive) {
++ if (knownPassCount != UNKNOWN) {
++ processImageProgress((pass + percentOfPass)*100.0F
++ / knownPassCount);
++ } else if (maxProgressivePass != Integer.MAX_VALUE) {
++ // Use the range of allowed progressive passes
++ processImageProgress((pass + percentOfPass)*100.0F
++ / (maxProgressivePass - minProgressivePass + 1));
++ } else {
++ // Assume there are a minimum of MIN_ESTIMATED_PASSES
++ // and that there is always one more pass
++ // Compute the percentage as the percentage at the end
++ // of the previous pass, plus the percentage of this
++ // pass scaled to be the percentage of the total remaining,
++ // assuming a minimum of MIN_ESTIMATED_PASSES passes and
++ // that there is always one more pass. This is monotonic
++ // and asymptotic to 1.0, which is what we need.
++ int remainingPasses = // including this one
++ Math.max(2, MIN_ESTIMATED_PASSES-pass);
++ int totalPasses = pass + remainingPasses-1;
++ progInterval = Math.max(height/20*totalPasses,
++ totalPasses);
++ if (y%progInterval == 0) {
++ percentToDate = previousPassPercentage +
++ (1.0F - previousPassPercentage)
++ * (percentOfPass)/remainingPasses;
++ if (debug) {
++ System.out.print("pass= " + pass);
++ System.out.print(", y= " + y);
++ System.out.print(", progInt= " + progInterval);
++ System.out.print(", % of pass: " + percentOfPass);
++ System.out.print(", rem. passes: "
++ + remainingPasses);
++ System.out.print(", prev%: "
++ + previousPassPercentage);
++ System.out.print(", %ToDate: " + percentToDate);
++ System.out.print(" ");
++ }
++ processImageProgress(percentToDate*100.0F);
++ }
++ }
+ } else {
+- // Assume there are a minimum of MIN_ESTIMATED_PASSES
+- // and that there is always one more pass
+- // Compute the percentage as the percentage at the end
+- // of the previous pass, plus the percentage of this
+- // pass scaled to be the percentage of the total remaining,
+- // assuming a minimum of MIN_ESTIMATED_PASSES passes and
+- // that there is always one more pass. This is monotonic
+- // and asymptotic to 1.0, which is what we need.
+- int remainingPasses = // including this one
+- Math.max(2, MIN_ESTIMATED_PASSES-pass);
+- int totalPasses = pass + remainingPasses-1;
+- progInterval = Math.max(height/20*totalPasses,
+- totalPasses);
+- if (y%progInterval == 0) {
+- percentToDate = previousPassPercentage +
+- (1.0F - previousPassPercentage)
+- * (percentOfPass)/remainingPasses;
+- if (debug) {
+- System.out.print("pass= " + pass);
+- System.out.print(", y= " + y);
+- System.out.print(", progInt= " + progInterval);
+- System.out.print(", % of pass: " + percentOfPass);
+- System.out.print(", rem. passes: "
+- + remainingPasses);
+- System.out.print(", prev%: "
+- + previousPassPercentage);
+- System.out.print(", %ToDate: " + percentToDate);
+- System.out.print(" ");
+- }
+- processImageProgress(percentToDate*100.0F);
+- }
++ processImageProgress(percentOfPass * 100.0F);
+ }
+- } else {
+- processImageProgress(percentOfPass * 100.0F);
+- }
++ }
++ } finally {
++ cbLock.unlock();
+ }
+ }
+
+@@ -1273,33 +1346,58 @@
+ }
+
+ private void passStarted (int pass) {
+- this.pass = pass;
+- previousPassPercentage = percentToDate;
+- processPassStarted(image,
+- pass,
+- minProgressivePass,
+- maxProgressivePass,
+- 0, 0,
+- 1,1,
+- destinationBands);
++ cbLock.lock();
++ try {
++ this.pass = pass;
++ previousPassPercentage = percentToDate;
++ processPassStarted(image,
++ pass,
++ minProgressivePass,
++ maxProgressivePass,
++ 0, 0,
++ 1,1,
++ destinationBands);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ private void passComplete () {
+- processPassComplete(image);
++ cbLock.lock();
++ try {
++ processPassComplete(image);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ void thumbnailStarted(int thumbnailIndex) {
+- processThumbnailStarted(currentImage, thumbnailIndex);
++ cbLock.lock();
++ try {
++ processThumbnailStarted(currentImage, thumbnailIndex);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ // Provide access to protected superclass method
+ void thumbnailProgress(float percentageDone) {
+- processThumbnailProgress(percentageDone);
++ cbLock.lock();
++ try {
++ processThumbnailProgress(percentageDone);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ // Provide access to protected superclass method
+ void thumbnailComplete() {
+- processThumbnailComplete();
++ cbLock.lock();
++ try {
++ processThumbnailComplete();
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ /**
+@@ -1323,6 +1421,11 @@
+ public void abort() {
+ setThreadLock();
+ try {
++ /**
++ * NB: we do not check the call back lock here,
++ * we allow to abort the reader any time.
++ */
++
+ super.abort();
+ abortRead(structPointer);
+ } finally {
+@@ -1345,6 +1448,7 @@
+ setThreadLock();
+ Raster retval = null;
+ try {
++ cbLock.check();
+ /*
+ * This could be further optimized by not resetting the dest.
+ * offset and creating a translated raster in readInternal()
+@@ -1384,6 +1488,8 @@
+ public int getNumThumbnails(int imageIndex) throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ getImageMetadata(imageIndex); // checks iis state for us
+ // Now check the jfif segments
+ JFIFMarkerSegment jfif =
+@@ -1404,6 +1510,8 @@
+ throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if ((thumbnailIndex < 0)
+ || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
+ throw new IndexOutOfBoundsException("No such thumbnail");
+@@ -1422,6 +1530,8 @@
+ throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if ((thumbnailIndex < 0)
+ || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
+ throw new IndexOutOfBoundsException("No such thumbnail");
+@@ -1441,6 +1551,8 @@
+ throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if ((thumbnailIndex < 0)
+ || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
+ throw new IndexOutOfBoundsException("No such thumbnail");
+@@ -1481,6 +1593,7 @@
+ public void reset() {
+ setThreadLock();
+ try {
++ cbLock.check();
+ super.reset();
+ } finally {
+ clearThreadLock();
+@@ -1492,6 +1605,8 @@
+ public void dispose() {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if (structPointer != 0) {
+ disposerRecord.dispose();
+ structPointer = 0;
+@@ -1553,4 +1668,34 @@
+ theThread = null;
+ }
+ }
++
++ private CallBackLock cbLock = new CallBackLock();
++
++ private static class CallBackLock {
++
++ private State lockState;
++
++ CallBackLock() {
++ lockState = State.Unlocked;
++ }
++
++ void check() {
++ if (lockState != State.Unlocked) {
++ throw new IllegalStateException("Access to the reader is not allowed");
++ }
++ }
++
++ private void lock() {
++ lockState = State.Locked;
++ }
++
++ private void unlock() {
++ lockState = State.Unlocked;
++ }
++
++ private static enum State {
++ Unlocked,
++ Locked
++ }
++ }
+ }
+diff --git openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
+--- jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
++++ jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
+@@ -57,8 +57,8 @@
+ #define MAX(a,b) ((a) > (b) ? (a) : (b))
+
+ /* Cached Java method ids */
+-static jmethodID ImageInputStream_readID;
+-static jmethodID ImageInputStream_skipBytesID;
++static jmethodID JPEGImageReader_readInputDataID;
++static jmethodID JPEGImageReader_skipInputBytesID;
+ static jmethodID JPEGImageReader_warningOccurredID;
+ static jmethodID JPEGImageReader_warningWithMessageID;
+ static jmethodID JPEGImageReader_setImageDataID;
+@@ -923,7 +923,7 @@ imageio_fill_input_buffer(j_decompress_p
+ RELEASE_ARRAYS(env, data, src->next_input_byte);
+ ret = (*env)->CallIntMethod(env,
+ sb->stream,
+- ImageInputStream_readID,
++ JPEGImageReader_readInputDataID,
+ sb->hstreamBuffer, 0,
+ sb->bufferLength);
+ if ((*env)->ExceptionOccurred(env)
+@@ -1013,7 +1013,7 @@ imageio_fill_suspended_buffer(j_decompre
+ }
+
+ ret = (*env)->CallIntMethod(env, sb->stream,
+- ImageInputStream_readID,
++ JPEGImageReader_readInputDataID,
+ sb->hstreamBuffer,
+ offset, buflen);
+ if ((*env)->ExceptionOccurred(env)
+@@ -1107,7 +1107,7 @@ imageio_skip_input_data(j_decompress_ptr
+ RELEASE_ARRAYS(env, data, src->next_input_byte);
+ ret = (*env)->CallLongMethod(env,
+ sb->stream,
+- ImageInputStream_skipBytesID,
++ JPEGImageReader_skipInputBytesID,
+ (jlong) num_bytes);
+ if ((*env)->ExceptionOccurred(env)
+ || !GET_ARRAYS(env, data, &(src->next_input_byte))) {
+@@ -1382,13 +1382,13 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
+ jclass qTableClass,
+ jclass huffClass) {
+
+- ImageInputStream_readID = (*env)->GetMethodID(env,
+- ImageInputStreamClass,
+- "read",
++ JPEGImageReader_readInputDataID = (*env)->GetMethodID(env,
++ cls,
++ "readInputData",
+ "([BII)I");
+- ImageInputStream_skipBytesID = (*env)->GetMethodID(env,
+- ImageInputStreamClass,
+- "skipBytes",
++ JPEGImageReader_skipInputBytesID = (*env)->GetMethodID(env,
++ cls,
++ "skipInputBytes",
+ "(J)J");
+ JPEGImageReader_warningOccurredID = (*env)->GetMethodID(env,
+ cls,
+@@ -1531,8 +1531,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
+ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_setSource
+ (JNIEnv *env,
+ jobject this,
+- jlong ptr,
+- jobject source) {
++ jlong ptr) {
+
+ imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr);
+ j_common_ptr cinfo;
+@@ -1546,7 +1545,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
+
+ cinfo = data->jpegObj;
+
+- imageio_set_stream(env, cinfo, data, source);
++ imageio_set_stream(env, cinfo, data, this);
+
+ imageio_init_source((j_decompress_ptr) cinfo);
+ }
diff --git a/java/openjdk6/files/icedtea/security/20130416/8007918.patch b/java/openjdk6/files/icedtea/security/20130416/8007918.patch
new file mode 100644
index 000000000000..35ee96352ef9
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8007918.patch
@@ -0,0 +1,357 @@
+# HG changeset patch
+# User bae
+# Date 1361827637 -14400
+# Node ID 90c9f1577a0b09128174b4d26404b438585428c5
+# Parent d868fe7c7618e5b55eea8dd69ee5d099c71816e0
+8007918: Better image writing
+Reviewed-by: prr, jgodinez
+
+diff --git openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
+--- jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
++++ jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
+@@ -178,8 +178,7 @@ public class JPEGImageWriter extends Ima
+ static {
+ java.security.AccessController.doPrivileged(
+ new sun.security.action.LoadLibraryAction("jpeg"));
+- initWriterIDs(ImageOutputStream.class,
+- JPEGQTable.class,
++ initWriterIDs(JPEGQTable.class,
+ JPEGHuffmanTable.class);
+ }
+
+@@ -195,11 +194,13 @@ public class JPEGImageWriter extends Ima
+ public void setOutput(Object output) {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ super.setOutput(output); // validates output
+ resetInternalState();
+ ios = (ImageOutputStream) output; // so this will always work
+ // Set the native destination
+- setDest(structPointer, ios);
++ setDest(structPointer);
+ } finally {
+ clearThreadLock();
+ }
+@@ -354,6 +355,8 @@ public class JPEGImageWriter extends Ima
+ ImageWriteParam param) throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ writeOnThread(streamMetadata, image, param);
+ } finally {
+ clearThreadLock();
+@@ -1077,13 +1080,18 @@ public class JPEGImageWriter extends Ima
+ haveMetadata,
+ restartInterval);
+
+- if (aborted) {
+- processWriteAborted();
+- } else {
+- processImageComplete();
++ cbLock.lock();
++ try {
++ if (aborted) {
++ processWriteAborted();
++ } else {
++ processImageComplete();
++ }
++
++ ios.flush();
++ } finally {
++ cbLock.unlock();
+ }
+-
+- ios.flush();
+ currentImage++; // After a successful write
+ }
+
+@@ -1091,6 +1099,8 @@ public class JPEGImageWriter extends Ima
+ throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ prepareWriteSequenceOnThread(streamMetadata);
+ } finally {
+ clearThreadLock();
+@@ -1170,6 +1180,8 @@ public class JPEGImageWriter extends Ima
+ throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if (sequencePrepared == false) {
+ throw new IllegalStateException("sequencePrepared not called!");
+ }
+@@ -1183,6 +1195,8 @@ public class JPEGImageWriter extends Ima
+ public void endWriteSequence() throws IOException {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if (sequencePrepared == false) {
+ throw new IllegalStateException("sequencePrepared not called!");
+ }
+@@ -1195,6 +1209,10 @@ public class JPEGImageWriter extends Ima
+ public synchronized void abort() {
+ setThreadLock();
+ try {
++ /**
++ * NB: we do not check the call back lock here, we allow to abort
++ * the reader any time.
++ */
+ super.abort();
+ abortWrite(structPointer);
+ } finally {
+@@ -1218,6 +1236,8 @@ public class JPEGImageWriter extends Ima
+ public void reset() {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ super.reset();
+ } finally {
+ clearThreadLock();
+@@ -1227,6 +1247,8 @@ public class JPEGImageWriter extends Ima
+ public void dispose() {
+ setThreadLock();
+ try {
++ cbLock.check();
++
+ if (structPointer != 0) {
+ disposerRecord.dispose();
+ structPointer = 0;
+@@ -1246,13 +1268,18 @@ public class JPEGImageWriter extends Ima
+ * sending warnings to listeners.
+ */
+ void warningOccurred(int code) {
+- if ((code < 0) || (code > MAX_WARNING)){
+- throw new InternalError("Invalid warning index");
++ cbLock.lock();
++ try {
++ if ((code < 0) || (code > MAX_WARNING)){
++ throw new InternalError("Invalid warning index");
++ }
++ processWarningOccurred
++ (currentImage,
++ "com.sun.imageio.plugins.jpeg.JPEGImageWriterResources",
++ Integer.toString(code));
++ } finally {
++ cbLock.unlock();
+ }
+- processWarningOccurred
+- (currentImage,
+- "com.sun.imageio.plugins.jpeg.JPEGImageWriterResources",
+- Integer.toString(code));
+ }
+
+ /**
+@@ -1269,21 +1296,41 @@ public class JPEGImageWriter extends Ima
+ * library warnings from being printed to stderr.
+ */
+ void warningWithMessage(String msg) {
+- processWarningOccurred(currentImage, msg);
++ cbLock.lock();
++ try {
++ processWarningOccurred(currentImage, msg);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ void thumbnailStarted(int thumbnailIndex) {
+- processThumbnailStarted(currentImage, thumbnailIndex);
++ cbLock.lock();
++ try {
++ processThumbnailStarted(currentImage, thumbnailIndex);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ // Provide access to protected superclass method
+ void thumbnailProgress(float percentageDone) {
+- processThumbnailProgress(percentageDone);
++ cbLock.lock();
++ try {
++ processThumbnailProgress(percentageDone);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ // Provide access to protected superclass method
+ void thumbnailComplete() {
+- processThumbnailComplete();
++ cbLock.lock();
++ try {
++ processThumbnailComplete();
++ } finally {
++ cbLock.unlock();
++ }
+ }
+
+ ///////// End of Package-access API
+@@ -1610,16 +1657,14 @@ public class JPEGImageWriter extends Ima
+ ////////////// Native methods and callbacks
+
+ /** Sets up static native structures. */
+- private static native void initWriterIDs(Class iosClass,
+- Class qTableClass,
++ private static native void initWriterIDs(Class qTableClass,
+ Class huffClass);
+
+ /** Sets up per-writer native structure and returns a pointer to it. */
+ private native long initJPEGImageWriter();
+
+ /** Sets up native structures for output stream */
+- private native void setDest(long structPointer,
+- ImageOutputStream ios);
++ private native void setDest(long structPointer);
+
+ /**
+ * Returns <code>true</code> if the write was aborted.
+@@ -1744,7 +1789,12 @@ public class JPEGImageWriter extends Ima
+ }
+ raster.setRect(sourceLine);
+ if ((y > 7) && (y%8 == 0)) { // Every 8 scanlines
+- processImageProgress((float) y / (float) sourceHeight * 100.0F);
++ cbLock.lock();
++ try {
++ processImageProgress((float) y / (float) sourceHeight * 100.0F);
++ } finally {
++ cbLock.unlock();
++ }
+ }
+ }
+
+@@ -1769,6 +1819,25 @@ public class JPEGImageWriter extends Ima
+ disposeWriter(pData);
+ pData = 0;
+ }
++ }
++ }
++
++ /**
++ * This method is called from native code in order to write encoder
++ * output to the destination.
++ *
++ * We block any attempt to change the writer state during this
++ * method, in order to prevent a corruption of the native encoder
++ * state.
++ */
++ private void writeOutputData(byte[] data, int offset, int len)
++ throws IOException
++ {
++ cbLock.lock();
++ try {
++ ios.write(data, offset, len);
++ } finally {
++ cbLock.unlock();
+ }
+ }
+
+@@ -1806,4 +1875,34 @@ public class JPEGImageWriter extends Ima
+ theThread = null;
+ }
+ }
++
++ private CallBackLock cbLock = new CallBackLock();
++
++ private static class CallBackLock {
++
++ private State lockState;
++
++ CallBackLock() {
++ lockState = State.Unlocked;
++ }
++
++ void check() {
++ if (lockState != State.Unlocked) {
++ throw new IllegalStateException("Access to the writer is not allowed");
++ }
++ }
++
++ private void lock() {
++ lockState = State.Locked;
++ }
++
++ private void unlock() {
++ lockState = State.Unlocked;
++ }
++
++ private static enum State {
++ Unlocked,
++ Locked
++ }
++ }
+ }
+diff --git openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
+--- jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
++++ jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
+@@ -66,7 +66,7 @@ static jmethodID JPEGImageReader_pushBac
+ static jmethodID JPEGImageReader_pushBackID;
+ static jmethodID JPEGImageReader_passStartedID;
+ static jmethodID JPEGImageReader_passCompleteID;
+-static jmethodID ImageOutputStream_writeID;
++static jmethodID JPEGImageWriter_writeOutputDataID;
+ static jmethodID JPEGImageWriter_warningOccurredID;
+ static jmethodID JPEGImageWriter_warningWithMessageID;
+ static jmethodID JPEGImageWriter_writeMetadataID;
+@@ -2290,7 +2290,7 @@ imageio_empty_output_buffer (j_compress_
+
+ (*env)->CallVoidMethod(env,
+ sb->stream,
+- ImageOutputStream_writeID,
++ JPEGImageWriter_writeOutputDataID,
+ sb->hstreamBuffer,
+ 0,
+ sb->bufferLength);
+@@ -2327,7 +2327,7 @@ imageio_term_destination (j_compress_ptr
+
+ (*env)->CallVoidMethod(env,
+ sb->stream,
+- ImageOutputStream_writeID,
++ JPEGImageWriter_writeOutputDataID,
+ sb->hstreamBuffer,
+ 0,
+ datacount);
+@@ -2365,13 +2365,12 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
+ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs
+ (JNIEnv *env,
+ jclass cls,
+- jclass IOSClass,
+ jclass qTableClass,
+ jclass huffClass) {
+
+- ImageOutputStream_writeID = (*env)->GetMethodID(env,
+- IOSClass,
+- "write",
++ JPEGImageWriter_writeOutputDataID = (*env)->GetMethodID(env,
++ cls,
++ "writeOutputData",
+ "([BII)V");
+
+ JPEGImageWriter_warningOccurredID = (*env)->GetMethodID(env,
+@@ -2495,8 +2494,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
+ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_setDest
+ (JNIEnv *env,
+ jobject this,
+- jlong ptr,
+- jobject destination) {
++ jlong ptr) {
+
+ imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr);
+ j_compress_ptr cinfo;
+@@ -2510,7 +2508,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
+
+ cinfo = (j_compress_ptr) data->jpegObj;
+
+- imageio_set_stream(env, data->jpegObj, data, destination);
++ imageio_set_stream(env, data->jpegObj, data, this);
+
+
+ // Don't call the init method, as that depends on pinned arrays
diff --git a/java/openjdk6/files/icedtea/security/20130416/8009063.patch b/java/openjdk6/files/icedtea/security/20130416/8009063.patch
new file mode 100644
index 000000000000..a15331af4bbc
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8009063.patch
@@ -0,0 +1,67 @@
+# HG changeset patch
+# User chegar
+# Date 1362305505 0
+# Node ID 98ad2f1e25d13aca196ad77b2f227f85072c9b16
+# Parent 17ac71e7b72087f0f7b7ac793ae93a816ef22d96
+8009063: Improve reliability of ConcurrentHashMap
+Reviewed-by: alanb, ahgross
+
+diff --git a/src/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/share/classes/java/util/concurrent/ConcurrentHashMap.java
+--- jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java
++++ jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java
+@@ -40,6 +40,7 @@ import java.io.IOException;
+ import java.io.IOException;
+ import java.io.ObjectInputStream;
+ import java.io.ObjectOutputStream;
++import java.io.ObjectStreamField;
+
+ /**
+ * A hash table supporting full concurrency of retrievals and
+@@ -1535,7 +1536,23 @@ public class ConcurrentHashMap<K, V> ext
+ @SuppressWarnings("unchecked")
+ private void readObject(java.io.ObjectInputStream s)
+ throws IOException, ClassNotFoundException {
+- s.defaultReadObject();
++ // Don't call defaultReadObject()
++ ObjectInputStream.GetField oisFields = s.readFields();
++ final Segment<K,V>[] oisSegments = (Segment<K,V>[])oisFields.get("segments", null);
++
++ final int ssize = oisSegments.length;
++ if (ssize < 1 || ssize > MAX_SEGMENTS
++ || (ssize & (ssize-1)) != 0 ) // ssize not power of two
++ throw new java.io.InvalidObjectException("Bad number of segments:"
++ + ssize);
++ int sshift = 0, ssizeTmp = ssize;
++ while (ssizeTmp > 1) {
++ ++sshift;
++ ssizeTmp >>>= 1;
++ }
++ UNSAFE.putIntVolatile(this, SEGSHIFT_OFFSET, 32 - sshift);
++ UNSAFE.putIntVolatile(this, SEGMASK_OFFSET, ssize - 1);
++ UNSAFE.putObjectVolatile(this, SEGMENTS_OFFSET, oisSegments);
+
+ // set hashMask
+ UNSAFE.putIntVolatile(this, HASHSEED_OFFSET, randomHashSeed(this));
+@@ -1568,6 +1585,9 @@ public class ConcurrentHashMap<K, V> ext
+ private static final int SSHIFT;
+ private static final long TBASE;
+ private static final int TSHIFT;
++ private static final long SEGSHIFT_OFFSET;
++ private static final long SEGMASK_OFFSET;
++ private static final long SEGMENTS_OFFSET;
+
+ static {
+ int ss, ts;
+@@ -1581,6 +1601,12 @@ public class ConcurrentHashMap<K, V> ext
+ SBASE = UNSAFE.arrayBaseOffset(sc);
+ ts = UNSAFE.arrayIndexScale(tc);
+ ss = UNSAFE.arrayIndexScale(sc);
++ SEGSHIFT_OFFSET = UNSAFE.objectFieldOffset(
++ ConcurrentHashMap.class.getDeclaredField("segmentShift"));
++ SEGMASK_OFFSET = UNSAFE.objectFieldOffset(
++ ConcurrentHashMap.class.getDeclaredField("segmentMask"));
++ SEGMENTS_OFFSET = UNSAFE.objectFieldOffset(
++ ConcurrentHashMap.class.getDeclaredField("segments"));
+ } catch (Exception e) {
+ throw new Error(e);
+ }
diff --git a/java/openjdk6/files/icedtea/security/20130416/8009305.patch b/java/openjdk6/files/icedtea/security/20130416/8009305.patch
new file mode 100644
index 000000000000..d469d5748708
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8009305.patch
@@ -0,0 +1,68 @@
+# HG changeset patch
+# User dfuchs
+# Date 1363278452 -3600
+# Node ID 31c782610044b0f04f981c2b97355804a1c57407
+# Parent 87bacc5ee8e430aadd200ae13a2d15fe9c8f4350
+8009305: Improve AWT data transfer
+Reviewed-by: art, skoivu, smarks, ant
+
+diff --git openjdk/jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java openjdk/jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java
+--- jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java
++++ jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java
+@@ -102,11 +102,11 @@ public class TransferableProxy implement
+ protected final boolean isLocal;
+ }
+
+-class ClassLoaderObjectOutputStream extends ObjectOutputStream {
++final class ClassLoaderObjectOutputStream extends ObjectOutputStream {
+ private final Map<Set<String>, ClassLoader> map =
+ new HashMap<Set<String>, ClassLoader>();
+
+- public ClassLoaderObjectOutputStream(OutputStream os) throws IOException {
++ ClassLoaderObjectOutputStream(OutputStream os) throws IOException {
+ super(os);
+ }
+
+@@ -140,15 +140,15 @@ class ClassLoaderObjectOutputStream exte
+ map.put(s, classLoader);
+ }
+
+- public Map<Set<String>, ClassLoader> getClassLoaderMap() {
++ Map<Set<String>, ClassLoader> getClassLoaderMap() {
+ return new HashMap(map);
+ }
+ }
+
+-class ClassLoaderObjectInputStream extends ObjectInputStream {
++final class ClassLoaderObjectInputStream extends ObjectInputStream {
+ private final Map<Set<String>, ClassLoader> map;
+
+- public ClassLoaderObjectInputStream(InputStream is,
++ ClassLoaderObjectInputStream(InputStream is,
+ Map<Set<String>, ClassLoader> map)
+ throws IOException {
+ super(is);
+@@ -166,8 +166,11 @@ class ClassLoaderObjectInputStream exten
+ s.add(className);
+
+ ClassLoader classLoader = map.get(s);
+-
+- return Class.forName(className, false, classLoader);
++ if (classLoader != null) {
++ return Class.forName(className, false, classLoader);
++ } else {
++ return super.resolveClass(classDesc);
++ }
+ }
+
+ protected Class<?> resolveProxyClass(String[] interfaces)
+@@ -179,6 +182,9 @@ class ClassLoaderObjectInputStream exten
+ }
+
+ ClassLoader classLoader = map.get(s);
++ if (classLoader == null) {
++ return super.resolveProxyClass(interfaces);
++ }
+
+ // The code below is mostly copied from the superclass.
+ ClassLoader nonPublicLoader = null;
diff --git a/java/openjdk6/files/icedtea/security/20130416/8009699.patch b/java/openjdk6/files/icedtea/security/20130416/8009699.patch
new file mode 100644
index 000000000000..f4a15a33693f
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8009699.patch
@@ -0,0 +1,25 @@
+# HG changeset patch
+# User andrew
+# Date 1365790031 -3600
+# Node ID e95f24ac8e1e3c54e389b55c6992a8fc0266a698
+# Parent ef36be1ae9bc7d061721f8890797e5d89c901846
+8009699: Methodhandle lookup
+Reviewed-by: ahgross, jrose, jdn
+
+diff --git a/src/share/vm/prims/methodHandles.cpp b/src/share/vm/prims/methodHandles.cpp
+--- hotspot/src/share/vm/prims/methodHandles.cpp
++++ hotspot/src/share/vm/prims/methodHandles.cpp
+@@ -536,6 +536,13 @@
+ }
+ }
+ methodHandle m = result.resolved_method();
++ KlassHandle mklass = m->method_holder();
++ KlassHandle receiver_limit = result.resolved_klass();
++ if (receiver_limit.is_null() ||
++ // ignore passed-in limit; interfaces are interconvertible
++ receiver_limit->is_interface() && mklass->is_interface()) {
++ receiver_limit = mklass;
++ }
+ oop vmtarget = NULL;
+ int vmindex = methodOopDesc::nonvirtual_vtable_index;
+ if (defc->is_interface()) {
diff --git a/java/openjdk6/files/icedtea/security/20130416/8009814.patch b/java/openjdk6/files/icedtea/security/20130416/8009814.patch
new file mode 100644
index 000000000000..322b4c1f5f87
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8009814.patch
@@ -0,0 +1,27 @@
+# HG changeset patch
+# User lancea
+# Date 1363442894 14400
+# Node ID a19614a3dabb1754f4e8b3f0eaf29053debce05f
+# Parent 0cf73f53c7e1236286ea600d766a0651fdf9b660
+8009814: Better driver management
+Reviewed-by: alanb, skoivu
+
+diff --git openjdk/jdk/src/share/classes/java/sql/DriverManager.java openjdk/jdk/src/share/classes/java/sql/DriverManager.java
+--- jdk/src/share/classes/java/sql/DriverManager.java
++++ jdk/src/share/classes/java/sql/DriverManager.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -516,7 +516,7 @@ public class DriverManager {
+ */
+ try{
+ while(driversIterator.hasNext()) {
+- println(" Loading done by the java.util.ServiceLoader : "+driversIterator.next());
++ driversIterator.next();
+ }
+ } catch(Throwable t) {
+ // Do nothing
diff --git a/java/openjdk6/files/icedtea/security/20130416/8009857.patch b/java/openjdk6/files/icedtea/security/20130416/8009857.patch
new file mode 100644
index 000000000000..7e042c905ba5
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8009857.patch
@@ -0,0 +1,66 @@
+# HG changeset patch
+# User smarks
+# Date 1363655131 25200
+# Node ID 2899c3dbf5e8791b559c39a75a820c17c729c20f
+# Parent b453d9be6b3f5496aa217ade7478d3b7fa32b13b
+8009857: Problem with plugin
+Reviewed-by: jdn, mchung
+
+diff --git openjdk/jdk/src/share/classes/sun/reflect/misc/MethodUtil.java openjdk/jdk/src/share/classes/sun/reflect/misc/MethodUtil.java
+--- jdk/src/share/classes/sun/reflect/misc/MethodUtil.java
++++ jdk/src/share/classes/sun/reflect/misc/MethodUtil.java
+@@ -50,8 +50,27 @@ import sun.security.util.SecurityConstan
+
+
+ class Trampoline {
++ static {
++ if (Trampoline.class.getClassLoader() == null) {
++ throw new Error(
++ "Trampoline must not be defined by the bootstrap classloader");
++ }
++ }
++
++ private static void ensureInvocableMethod(Method m)
++ throws InvocationTargetException
++ {
++ Class<?> clazz = m.getDeclaringClass();
++ if (clazz.equals(AccessController.class) ||
++ clazz.equals(Method.class))
++ throw new InvocationTargetException(
++ new UnsupportedOperationException("invocation not supported"));
++ }
++
+ private static Object invoke(Method m, Object obj, Object[] params)
+- throws InvocationTargetException, IllegalAccessException {
++ throws InvocationTargetException, IllegalAccessException
++ {
++ ensureInvocableMethod(m);
+ return m.invoke(obj, params);
+ }
+ }
+@@ -255,10 +275,6 @@ public final class MethodUtil extends Se
+ */
+ public static Object invoke(Method m, Object obj, Object[] params)
+ throws InvocationTargetException, IllegalAccessException {
+- if (m.getDeclaringClass().equals(AccessController.class) ||
+- m.getDeclaringClass().equals(Method.class))
+- throw new InvocationTargetException(
+- new UnsupportedOperationException("invocation not supported"));
+ try {
+ return bounce.invoke(null, new Object[] {m, obj, params});
+ } catch (InvocationTargetException ie) {
+@@ -292,10 +307,10 @@ public final class MethodUtil extends Se
+
+ types = new Class[] {Method.class, Object.class, Object[].class};
+ b = t.getDeclaredMethod("invoke", types);
+- ((AccessibleObject)b).setAccessible(true);
+- return b;
+- }
+- });
++ b.setAccessible(true);
++ return b;
++ }
++ });
+ } catch (Exception e) {
+ throw new InternalError("bouncer cannot be found");
+ }
diff --git a/java/openjdk6/files/patch-set b/java/openjdk6/files/patch-set
index 0fabe80c09e8..c7316fb811e1 100644
--- a/java/openjdk6/files/patch-set
+++ b/java/openjdk6/files/patch-set
@@ -8831,6 +8831,19 @@
// Forward declarations of classes defined here
+--- jaxp/jaxp.properties
++++ jaxp/jaxp.properties
+@@ -25,8 +25,8 @@
+
+ drops.master.copy.base=${drops.dir}
+
+-jaxp_src.bundle.name=jaxp144_04.zip
+-jaxp_src.bundle.md5.checksum=0ace787aa12177d201947e8ba0ba9bdd
++jaxp_src.bundle.name=jaxp144_05.zip
++jaxp_src.bundle.md5.checksum=03be10db6ee87a8163316a87a3d3cba5
+ jaxp_src.master.bundle.dir=${drops.master.copy.base}
+ jaxp_src.master.bundle.url.base=http://download.java.net/jaxp/openjdk/jdk6
+
--- jdk/make/com/sun/java/pack/Makefile
+++ jdk/make/com/sun/java/pack/Makefile
@@ -61,6 +61,7 @@